在模式对话框中使用Django threadcomments并获取KeyError

时间:2013-04-15 21:35:57

标签: django

使用模态对话框和使用Ajax时,我得到KeyError (Exception Value: 'request)。 这是我的设置:

当有人点击某个链接时,会有一个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'

此评论适用于我使用它的其他任何地方。这让我觉得我应该包括一些我缺少的东西。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

我不了解您的模型和视图架构,但有一种方法可以帮助您解决这个问题,即将html保留在另一个单独的html中的recursetree或其他的jQuery's文件。并在执行ajax或post函数时通过load $('#pre_comments').load('comments_div.html #comments'); 函数将其加载到div中。

comments

此代码将comments_div.html中ID为pre_comments的所有div加载到当前页面的data.part div中。

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

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

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

<强>更新

你可以像这样更新你的观点吗?然后使用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 }) 再次检查$ .get请求。

{{1}}

答案 1 :(得分:0)

好了很多搜索之后我找到了答案,这与在django自定义模板标签中访问请求有关....

您可以在此处看到答案:Access request in django custom template tags

我使用了以下内容:

from django.template import RequestContext       

然后更改以下行:

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

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