Django可重用表单csrf错误

时间:2013-06-14 17:37:31

标签: python django django-forms csrf django-csrf

我想添加一个表单,使用Django在我的网站上的多个页面上记录用户。我不想多次复制表单,而是想使用“include”语句导入相同的表单。我的代码现在做错了两件事:它没有显示输入用户名或密码的字段,提交表单会产生CSRF 403(Forbidden)错误。

示例html:

        <!-- Login -->
<div id="login">
    <form action="/login/" method="post">
    {% csrf_token %}
    {% include "registration/login_snippet.html" %}
            <p>
            <input type="submit" value="login"/></p>
            </form>
</div> 

login_snippet.html:

{% csrf_token %}
<label for="id_username">
    Username:
</label>
{% if form.username.errors %} 
<span class="error">
{{ form.username.errors|join:", " }}
</span>
{% endif %}
{{ form.username }}
<label for="id_password">
     Password:
</label>
{% if form.password.errors %} 
<span class="error">
    {{ form.password.errors|join:", " }}
</span>
{% endif %}
{{ form.password }}

以下是显示的内容: login form

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

尝试在代码中添加以下内容。我不是百分百肯定,但我认为它应该有效。显然,这会禁用csrf保护。但是,它应该允许您继续运行您的网站。虽然csrf很重要,但我不确定它是否对每个视图都是强制性的。

from django.views.decorators.csrf import csrf_exempt
    #Make this a function in your classview

        @csrf_exempt
        def dispatch(self, *args, **kwargs):
            return super(YOUR_VIEW_NAME_HERE, self).dispatch(*args, **kwargs)

答案 1 :(得分:0)

问题1(用户名和密码无字段):

您确定表单对象是否在上下文中?似乎模板无法访问{{form}},因此无法呈现{{form.username}}

问题2(csrf):

您要两次包含{%csrf_token%}。一旦进入sample.html,一次进入login_snippet.html。删除其中一个可能会解决问题。

<强>最后,

此外,是否有任何理由说明整个登录表单不在一个代码段中?为什么要将'form'元素与字段分开?