2

重複の可能性:
Django 1.4 の CSRF 保護

Djangoを使ってロケットのチケット予約の簡単なシステムを作ろうとしています。ただし、チケットを予約しようとするたびに、Forbidden 403 エラーが発生しますCSRF token missing or incorrect

これが私のコードです:

models.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))

order.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 に答える