0

KeyError (Exception Value: 'request)在使用模式对话框和使用 Ajax 时遇到了问题。这是我的设置:

当有人点击一个链接时,会有一个 ajax 调用运行一个函数来查询一个名为 part 的对象:

<script type="text/javascript">
$(document).ready(function() {
  $(document).on("click", ".lib", function () {
       var id = $(this).attr("id");
         $.get("/models/"+id+"/viewmodelinfo/", function(data) {
           $(".modal-body").html(data);
           $('#mySymModal').modal('show');
       });
  });
});
</script>

这是查询零件对象的函数:

def viewmodelinfo(request, model_id):
  part = Part.objects.get(id=model_id)
  return render_to_response("models/viewmodelmodal.html", {"part": part })

这会发回 html 数据,这些数据在modal-body我的模态对话框的 div 中被替换。

这一切都很好,除非我在viewmodelmodal模板中有以下代码行:

{% comments part %}

在这种情况下,我得到一个KeyError.

这是回溯:

追溯:

File "/Users/user1/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/user1/Desktop/store/models/views.py" in viewmodelinfo
  467.   return render_to_response("models/viewmodelmodal.html", {"part": part })
File "/Users/user1/Desktop/myenv2/lib/python2.7/site-packages/django/shortcuts/__init__.py" in render_to_response
  20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/Users/user1/Desktop/myenv2/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  171.         return t.render(Context(dictionary))
File "/Users/user1/Desktop/myenv2/lib/python2.7/site-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/Users/user1/Desktop/myenv2/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  62.     return self.nodelist.render(context)
File "/Users/user1/Desktop/myenv2/lib/python2.7/site-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/Users/user1/Desktop/myenv2/lib/python2.7/site-packages/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/Users/user1/Desktop/myenv2/lib/python2.7/site-packages/django/template/base.py" in render
  1178.                     _dict = func(*resolved_args, **resolved_kwargs)
File "/Users/user1/Desktop/store/apps/threadedcomments_extras/templatetags/comments_tag.py" in comments
  13.         "request": context["request"],
File "/Users/user1/Desktop/myenv2/lib/python2.7/site-packages/django/template/context.py" in __getitem__
  54.         raise KeyError(key)

Exception Type: KeyError at /models/384/viewmodelinfo/
Exception Value: 'request'

此评论在我使用它的其他任何地方都可以正常工作。这使我认为我应该包括一些我缺少的东西。有任何想法吗?

4

2 回答 2

0

好的,经过大量搜索,我找到了答案,这与在 django 自定义模板标签中访问请求有关....

你可以在这里看到答案:在 django custom template tags 中访问请求

我使用了以下内容:

from django.template import RequestContext       

然后更改以下行:

  return render_to_response("models/viewmodelmodal.html", {"part": part }),
                              context_instance = RequestContext(request))

我真的希望这对其他人有帮助!:-)

于 2013-04-16T00:55:44.753 回答
0

如果我理解正确,你想用来自服务器的新数据重新加载你的 div。没有页面刷新。我有几乎同样的问题。如果您正在使用django-mptt,重新加载 amptt tag有点棘手。

我不了解您的模型和视图架构,但是可以帮助您解决此问题的方法之一是将html具有 mptt 标记(likerecursetree或其他标记)的标记保留在另一个 html 文件中。jQuery's load并在执行 ajax 或 post 函数时通过函数将其加载到您的 div 中。

$('#pre_comments').load('comments_div.html #comments');

此代码将所有具有 id commentsin的 div 加载comments_div.htmlpre_comments当前页面的 div 中。

因此,请使用 comments_div.html 页面在您的视图中保存和阅读。您可以将其内容加载到您的模态中。

如果我弄错了这个问题,我很抱歉。

注意:如果需要更多代码或解释,请随时说出来。

更新:

你能像这样更新你的观点吗?然后再次检查您的 $.get 请求data.part

def viewmodelinfo(request, model_id):
    from django.core import serializers
    part = Part.objects.get(id=model_id)
    if part:
        json = {part,}
        data = serializers.serialize('json',json)
        return HttpResponse(data)       

    return render_to_response("models/viewmodelmodal.html", {"part": part })
于 2013-04-15T22:09:11.113 回答