【问题标题】:Error CSRF verification failed. Request aborted in Django错误 CSRF 验证失败。在 Django 中请求中止
【发布时间】:2014-11-03 11:06:06
【问题描述】:

我正在学习 django,当我尝试在输入文本中输入一个值并将其作为参数传递给其他表单时,我得到了这些错误。

禁止 (403) CSRF 验证失败。请求中止。

失败的原因: CSRF 令牌丢失或不正确。

这是我的sn-ps

forms.py

class ConfigForm(forms.ModelForm):
    def __init__(self,*args, **kwargs):
        id_provider = kwargs.pop('id_provider')
        super(ConfigForm,self).__init__(*args, **kwargs)
        self.fields['id_provider'].widget= forms.TextInput(attrs='id_provider:Id_provider'})
    id_provider = forms.CharField()

    class Meta:
       model = Config

views.py

def configView(request):
    a = request.session.get('a', None)
    if request.method == 'POST':
       form = ConfigForm(request.POST, instance=a)
       if form.is_valid():
          save_it = form.save(commit=False)
          save_it.save()
    else:
       form = ConfigForm(instance = a)

    return render_to_response("config.html",{'id_providor':id_provider},context_instance=RequestContext(request))

我尝试将值发送到参数的html代码:

<form method='post' action="/config/">
<input type="text" class="form-control" name="id_provider" id="id_provider" value="{{ id_providor }}"/>
<input class="btn btn-danger" type="submit" value="Config">

config.html(我发送值的表单)

{% extends 'base.html' %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-md-4">
<form method='POST' action='' class='form'>
   <div class="form-group">
        {% csrf_token %}
        {{ form.as_p }}
   </div>
   <button type='submit' class="btn btn-primary">Save</button>
</form>
</div>
</div>
</div>
{% endblock %}

我不知道错误是在视图中还是我尝试发送参数的方式。 请帮忙 提前致谢

更新 我用 ConfigView(views.py) 上方的标志 @csrf_exempt 解决了这个问题 现在我有这个错误:

KeyError at /config/

'id_proveedor'

Request Method:     POST
Request URL:    http://192.168.0.219:8080/config/
Django Version:     1.6.5
Exception Type:     KeyError
Exception Value:    

'id_provider'

Exception Location:     /home/pyc/DjangoProjects/monitor/prov/forms.py in __init__, line 19
Python Executable:  /usr/local/bin/python
Python Version:     2.7.3
Python Path:    

['/home/pyc/DjangoProjects/monitor',
 '/usr/local/lib/python2.7/site-packages/simplejson-3.6.0-py2.7-linux-x86_64.egg',
 '/usr/local/lib/python27.zip',
 '/usr/local/lib/python2.7',
 '/usr/local/lib/python2.7/plat-linux2',
 '/usr/local/lib/python2.7/lib-tk',
 '/usr/local/lib/python2.7/lib-old',
 '/usr/local/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/site-packages']

我不明白出了什么问题。 有什么建议吗??

【问题讨论】:

  • 这个html sn-p属于哪里?它不是 config.html 模板的一部分,是吗?
  • yes 在 config.html 模板中。我将标志@csrf_exempt 放在views.py 中并且错误消失了,现在我有一个新错误: KeyError at /config/ 'id_provider' Exception Location: /home/pyc/DjangoProjects/monitor/prov/forms.py in 初始化,第 19 行

标签: python django django-forms csrf


【解决方案1】:

您可能不想使用@csrf_exempt,除非您有充分的理由禁用 CSRF 保护。

不是 100% 清楚,但我认为您没有在实际提交的表单中包含 {% csrf_token %}。您需要确保在将使用POST 提交的每个 HTMl 表单中都使用此标记。

【讨论】:

  • 我在表单的模板中使用了csrf_token标签,但是不知道为什么会收到这个错误
    {% csrf_token %} {{ form.as_p }}
【解决方案2】:

试试这个:

class ConfigForm(forms.ModelForm):
    def __init__(self,*args, **kwargs):
        id_provider = kwargs.pop('id_provider')
        super(ConfigForm,self).__init__(*args, **kwargs)
        if self.fields.has_key('id_provider'):
            self.fields['id_provider'].widget= forms.TextInput(attrs='id_provider:Id_provider'})
    id_provider = forms.CharField()

    class Meta:
       model = Config

告诉我它是否有效。

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 2012-12-07
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2014-02-03
    相关资源
    最近更新 更多