【问题标题】:Django re-usable form csrf errorDjango可重用表单csrf错误
【发布时间】:2013-06-11 10:35:15
【问题描述】:

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

示例 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_sn-p.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 }}

下面是显示的内容:

任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    尝试将以下内容添加到您的代码中。我不是 100% 确定,但我认为它应该有效。显然,这会禁用 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】:

      对于问题 1(没有用户名和密码字段):

      您确定表单对象在上下文中吗?模板似乎没有可以访问的 {{ form }},因此它无法呈现 {{ form.username }}

      对于问题 2 (csrf):

      您将包含 {% csrf_token %} 两次。一次在 sample.html 中,一次在 login_sn-p.html 中。删除其中一个可能会解决问题。

      最后,

      另外,有什么原因导致整个登录表单不在一个 sn-p 中?为什么要将“表单”元素与字段分开?

      【讨论】:

        猜你喜欢
        • 2017-07-19
        • 2013-07-13
        • 2019-10-04
        • 2016-06-22
        • 2015-12-23
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        • 2013-03-21
        相关资源
        最近更新 更多