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)

2 years ago

尝试在代码中添加以下内容 . 我不是百分百肯定,但我认为它应该有效 . 显然,这会禁用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)

2 years ago

For problem 1 (no field for username and password):

你确定表单对象在上下文中吗?似乎模板无法访问{},因此无法呈现{}

For Problem 2 (csrf):

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

Finally,

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