禁止(403)CSRF验证失败

时间:2020-01-17 10:26:51

标签: django csrf

当我单击add_tech.html中的“确定”按钮时,它将重定向我在upload_type.html上。 但是单击确定按钮时显示错误。

错误-

禁止(403) CSRF验证失败。请求中止。 救命 失败原因: CSRF令牌丢失或不正确。

我的模板(add_tech.html)-

<form action="/uploads/type/" method="post">
  <label for="your_name">New Tech: </label>
  <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
  <input type="submit" value="OK">
</form>   

我的模板(upload_type.html)-

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{form}}
</form>

我的View.py-

def upload_type(request):
    if request.method =='POST':   
        details = NameForm(request.POST) 
        if details.is_valid():
            return render(request, "core/upload_type.html", {'form':details})  
    else:
        details = NameForm()

    return render(request, 'core/upload_type.html', {'form': details})

我的Url.py-

    urlpatterns = [
    url(r'^uploads/type/$', views.upload_type, name='upload_type'),]

我的form.py-

from uploads.core.models import Name 
class NameForm(forms.ModelForm):
    class Meta:
        model = Name
        fields = ('your_name', )

我的模型.py-

class Name(models.Model):
    your_name = models.CharField(max_length=100)

2 个答案:

答案 0 :(得分:0)

django模板中的post方法需要具有这样的csrf令牌

 <form action="/uploads/type/" method="post">
     {% csrf_token %}
  <label for="your_name">New Tech: </label>
  <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
  <input type="submit" value="OK">
   </form>   

答案 1 :(得分:0)

对于POST请求,需要csrf令牌。因此,请在模板中添加{{%csrf_token%}。

<form action="/uploads/type/" method="post">
  {% csrf_token %}
  <label for="your_name">New Tech: </label>
  <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
  <input type="submit" value="OK">
</form>  

来自Docs

Django随附了易于使用的跨站点请求防护 伪造品。 通过带有CSRF保护的POST提交表单时 启用后,您必须像前面一样使用csrf_token模板标签 例子。