2015-02-11 156 views
1

我对Django表单非常陌生。我试图简单地从文本字段获取值并将其存储在数据库中。我收到一条错误报告:CSRF令牌在Django表格中丢失或不正确

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

对于POST表单,您需要确保:

您的浏览器是否接受Cookie。

视图函数使用RequestContext作为模板而不是上下文。

在该模板中,每个POST表单内都有一个以%ssrf_token%为模板的标记,用于定位内部URL。

如果你不使用CsrfViewMiddleware,则必须在使用该csrf_token模板标记任何视图使用csrf_protect,以及那些接受POST数据。*

我要去哪里错了?

我views.py代码:

from django.shortcuts import render 
from feedback.models import Test 
from mysite.forms import TestForm 
from django.http import HttpResponse 
from django.template import Context, loader 

def test_view(request): 
    form = TestForm 
    t = loader.get_template('form.html') 
    c = RequestContext(request,{'n':''}) 
    if request.method=='POST': 
     form = TestForm(request.POST) 
     if form.is_valid(): 
      in_name = request.POST.get("firstname") 
      fd = Test(name = in_name) 
      fd.save() 
    return HttpResponse(t.render(c)) 

我的models.py代码:

from django.db import models 
from django.forms import ModelForm 

class Test(models.Model): 
     name = models.CharField(max_length=255) 

class TestForm(ModelForm): 
     class Meta: 
      model = Test 
      fields = ['name'] 

我forms.py代码:

from django import forms 

class TestForm(forms.Form): 
     name = forms.CharField() 

我的HTML模板是:

<!DOCTYPE html> 
<html> 
<head> 
    <title>test form</title> 
</head> 

<body> 

<form method = "POST"> 
{% csrf_token %} 
First name:<br> 
<input type="text" name="firstname" value = {{ n }}> 
<br><br><br> 
<input type="submit" value="Submit"> 
</form> 
</body> 

</html> 

回答

0

你做错了,非常PHPish的方式。

models.py移动表单定义为forms.py,所以你feedback/forms.py应该是:

from django.forms import ModelForm 

class TestForm(forms.ModelForm): 
     class Meta: 
      model = Test 
      fields = ['name'] 

feedback/views.py应该简化为:

from django.shortcuts import render, redirect 

from feedback.forms import TestForm 

def test_view(request): 
    if request.method == 'POST': 
     form = TestForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return redirect('.') 
    else: 
     form = TestForm() 
    return render(request, 'form.html', {'form': form}) 

而且模板:

<!DOCTYPE html> 
<html> 
<head> 
    <title>test form</title> 
</head> 

<body> 

    <form method="POST"> 
     {% csrf_token %} 
     {{ form.as_p }} 
     <input type="submit" value="Submit"> 
    </form> 

</body> 

</html> 
相关问题