2012-12-20 145 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令牌的代码。 –

相关问题