Django中CSRF验证失败,请求已中止

0 投票
2 回答
871 浏览
提问于 2025-04-20 18:27

我正在学习Django,当我尝试在输入框中输入一个值并把它作为参数传递给另一个表单时,遇到了这个错误。

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

失败的原因是: 缺少或不正确的CSRF令牌。

这是我的代码片段:

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']

我不明白哪里出错了。 有什么建议吗??

2 个回答

0

试试这个:

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

告诉我它是否有效。

0

你可能不想使用 @csrf_exempt,除非你有非常好的理由来关闭CSRF保护。

虽然不是特别明确,但我觉得你在提交的表单中没有包含 {% csrf_token %}。你需要确保在每个使用 POST 提交的HTML表单中都使用这个标签。

撰写回答