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

おそらく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 に答える
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 に答える