我想添加一个表单,使用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 }}
以下是显示的内容:
非常感谢任何帮助!
答案 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'元素与字段分开?