2015-02-11 68 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> 
相關問題