2

可能重复:
Django 1.4 中的 CSRF 保护

我正在尝试使用 Django 制作一个简单的火箭票预订系统。但是,每次我尝试预订机票时,都会收到 Forbidden 403 错误:CSRF token missing or incorrect.

这是我的代码:

模型.py:

class Tickets(models.Model):
    rocket_line = models.ForeignKey('Rockets')
    date = models.DateField()
    number_of_seats = models.IntegerField()
    email = models.CharField(max_length=50)
    ordered_on = models.DateTimeField()
    total_price = models.DecimalField(max_digits=10, decimal_places=2)
    def __unicode__(self):
        return str(self.id)

视图.py:

def order(request):
    if request.method == 'POST':
        order = Tickets(
            rocket_line = Rockets.objects.get(id=request.POST['rocket_line']),
            date=request.POST['date'],
            number_of_seats=request.POST['number_of_seats'],
            email=request.POST['email'],
            ordered_on=datetime.now(),
            total_price=(float(number_of_seats) * float(Rockets.objects.get(id=request.POST['rocket_line']).rprice))
        )
        order.save()
        return HttpResponseRedirect('/menu/')
    else:
        all_rockets = Rockets.objects.all().order_by('rtime')
        return render_to_response('order.html', { 'all_rockets': all_rockets},  RequestContext(request))

订单.html:

<h1>You can order a ticket here:</h1>

        <form action="/order/" method="post">       
        <p>             
        <label>Rocket_line</label>
        <select name="rocket_line">
            {% for rocket in all_rockets %}
                <option value="{{ rocket.id }}">{{ rocket }}</option>
            {% endfor %}
        </select>
        <label>Date</label>
        <input name="date" value="YYYY-MM-DD" type="text" size="10" />
        <label>Number of seats</label>
        <input name="number_of_seats" value="" type="text" size="10" />
        <label>E-mail</label>
        <input name="email" value="@" type="text" size="50" />
        <br /><br />
        <input class="button" value="Order" type="submit" />        
        </p>        
        </form>             
    <br />

你能帮我解决一下,问题可能出在哪里吗?

4

1 回答 1

6

取自全能的 django文档

第1步:

将中间件“django.middleware.csrf.CsrfViewMiddleware”添加到中间件类列表 MIDDLEWARE_CLASSES。(它应该出现在任何假定 CSRF 攻击已被处理的视图中间件之前。)

第2步:

<form action="." method="post">{% csrf_token %}

{% csrf_token %} 就是您需要添加到模板中的所有内容。

周围还有其他解决方案(装饰器或基于 ajax),但这个是最快和最常用的(我认为,至少......它不需要任何麻烦来实现)

于 2013-01-02T11:23:42.723 回答