1

我有一个模型:

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 的新手,我不知道问题出在哪里。

4

4 回答 4

4

您误解了如何处理 CSRF 令牌。您在 POST 上创建它,但重点是为 GET 请求上表单的原始显示创建它。它在 POST 上由中间件检查,因此您无需在此处添加它。

您应该使用rendersurfeurX 推荐的调用,但首先显示表单的调用。

于 2012-12-20T13:30:38.780 回答
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 表单文档

于 2012-12-20T12:23:25.487 回答
0

你如何渲染你的模板???我认为您的 csrf_token 不会打印任何隐藏的输入,请在模板上下文中添加“请求”,例如:

return render(request, "template.html", {"var": var})

https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render

于 2012-12-20T12:18:08.513 回答
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/

于 2012-12-20T12:17:40.323 回答