2012-12-20 143 views
1

我有一個模型:Django CSRF驗證失敗。請求中止

class Tour(models.Model): 

    owner_id = models.ForeignKey(User) 
    name = models.CharField(max_length=50) 
    location = models.ManyToManyField(Location) 
    subscribers = models.ManyToManyField(User, related_name="sub") 
    tour_date = models.DateField(null=True) 
    description = models.CharField(max_length=300, null=True) 

這包括這種形式的模板:

<form method="post" action="/mytours/"> 
{% csrf_token %} 
<input name="name" value="{{ name }}" class="pull-left" type="text" placeholder="Type the tour name... "></br> 
<input name="tour_date" value="{{ tour_date }}" type="text" id="datepicker" placeholder="Pick a tour date..."/> 
    <button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button> 
    <button type="submit" class="btn btn-primary">Save</button> 
</form> 

而在我的意見,我試圖添加到我的數據庫是什麼填寫表格:

if request.method == 'POST': 
     location = Location.objects.get(id=1) 
     name = request.POST.get('name', '') 
     tour_date = request.POST.get('tour_date', '') 
     tour = Tour() 
     tour.owner_id = user.pk 
     tour.name = name 
     tour.tour_date = tour_date 
     tour.location = location 
     tour.save() 
     c = {'name':name, 'tour_date':tour_date, 'tour':tour} 
     c.update(csrf(request)) 
     return render_to_response("myTours.html", c) 

我是新的django,我不知道問題在哪裏。

回答

0

你可能需要添加django.middleware.csrf.CsrfViewMiddleware到MIDDLEWARE_CLASSES和RequestContext的添加到您的迴應:

return render_to_response("myTours.html", c, context_instance=RequestContext(request)) 

https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/

+0

http://stackoverflow.com/questions/10388033/csrf-verification-failed-request-aborted – AJJ

+1

「Django CSRF驗證失敗,請求中止」可能是由中間件引發的。 – jpic

+0

@jpic,是的,我的錯誤,你必須是正確的,如果錯誤出現的中間件必須在場,他大概只需要添加context_instance。 – AJJ

1

我做的時候我實現Django表單是寫一個窗體類和創建它在視圖中的一個實例。然後將該實例傳遞給模板。

# form class eg. in models.py 
from django import forms 

class TourForm(forms.Form): 
    name = forms.CharField(max_length=50) 

# in the view 
if request.method == 'POST': 
    form = TourForm(request.POST) 
    if form.is_valid(): 
     # do your stuff here with form data 
else: 
    form = TourForm() # An unbound form 

return render(request, 'myTours.html', { 
    'form': form, 
}) 

在你的模板就可以顯示所產生的形式是這樣的:

<form action="/mytours/" method="post">{% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Save" class="btn btn-primary" /> 
</form> 

進一步的信息只是往裏官方django forms documentation

4

你誤會做什麼用的CSRF令牌。你在POST創建它,但問題是創造它的GET請求的形式的原始畫面。它由POST中的中間件檢查,所以你不需要在那裏添加它。

您應該使用render調用所推薦的surfeurX,而是顯示在首位的形式調用。

+0

你是什麼意思?我不應該在模板中有csrf_token? – user1855165

+0

我不明白你怎麼能得到從我說的,也不是如何使它更清楚。你有一些你沒有顯示的代碼,它顯示了用戶在發佈前填寫的表單。這是需要CSRF令牌的代碼。 –

相關問題