Threadedcomments - csrf token和user_name

时间:2011-01-30 12:13:42

标签: django django-comments

我正在使用django-threadedcomments。一切正常,除了两件事:csrf令牌和用户模板标签。

问题是,当用户提交注释时,表单没有csrf标记,因此无法在服务器端验证表单。尝试将csrf标记添加到线程注释传递到内部但没有结果的字典;不断收到错误(大多数人都说这个方法只有2个参数,只有3个)。试图修复那些接受3个参数的方法,然后再传递第三个参数;没有成功。

有人在过去偶然遇到同样的问题并解决了吗?因为这对我来说不是一个可以接受的解决方案:

MIDDLEWARE_CLASSES = (
    #'django.middleware.csrf.CsrfViewMiddleware',
)

第二个 - 有一个HTML帮助器来获取发布评论的用户的user_id。是否有开箱即用的html帮助器来获取用户名或者我必须自己编写它?

http://code.google.com/p/django-threadedcomments/

这是该项目的代码,我无法确切地告诉它应该在哪里发布,所以我只是链接到整个项目。

我真的被困在这里,欢迎任何帮助。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您应该在视图中使用{% csrf_token %}代码或@csrf_protect

答案 1 :(得分:1)

  

尝试将csrf令牌添加到   具有线程注释的字典   传递内部没有结果;

csrf_token是一个模板标记 - 它不应该作为参数在某处传递。

我查看了threadedcomments并且它基于contrib.comments而没有html呈现,因此您可以在模板中插入csrf_token

显示表单代码的TEMPLATE代码是什么样的?

如果您已启用CsrfViewMiddleware并且在视图中使用RequestContext,则只需在{% csrf_token %}标记内添加<form></form>即可。

至于获取用户名
ThreadedCommentComment的子类,具有name属性,或者您可以直接访问User ...

{% for comment in comments % 
    {{ comment.user.first_name }}
    {{ comment.name }}
{% endfor %}

答案 2 :(得分:-1)

您可以将表单放在自己的模板中,并将{% include %}放入页面模板中。从Django 1.3开始,{% include %}可以将上下文变量传递给包含的模板。以下是我使用django.contrib.comments而不是模板标签的内容:

...
{% include "comments/comment-form.html" with content_object=article user=request.user %}
...

{%csrf_token %}适用于此附带的模板,因为它正在使用您的主视图上下文。