バインド済みフォームと未バインドフォーム
CoddyのDjangoジャーニー「フォーム」セクションの一部。レッスン 7/20。
日付を next friday にしてフォームを送信してみてください。ページが空の状態で戻り、「Please check the form.」とだけ表示されます。ビューは新しい空のフォームを描画し、検証したフォームには入力内容が入っていました。
データを使って作成したフォームはバインド済みです。ContactForm(request.POST)には訪問者が入力した内容が保持され、is_valid()の後にはエラーも保持されます。ContactForm()は未バインドで、空であり、エラーもありません。{{ form }}で描画すると、バインド済みフォームには各値が表示され、間違ったフィールドの下には Enter a valid date. のようなエラーが表示されます。
つまり、フォームを使うビューには3つのケースがあります。
- GET:未バインドのフォームをレンダリングする。
- 失敗するPOST:検証したバインド済みフォームをレンダリングする。
- 成功するPOST:保存してリダイレクトする。
最後に1つの render() を置けば、最初の2つのケースに対応できます。
チャレンジ
簡単new_eventでは、POSTが失敗した後は検証済みのフォームを、GETでは空のフォームを表示します。- ビューと
new_event.htmlからerrorメッセージを削除します。フォームが独自のエラーを表示するようになりました。
Runを押し、日付にnext fridayを入力してフォームを送信し、日付の下を確認します。
自分で試してみよう
from django.shortcuts import get_object_or_404, redirect, render
from .forms import EventForm
from .models import Event
def event_list(request):
q = request.GET.get("q", "")
events = Event.objects.all()
if q:
events = events.filter(title__icontains=q)
return render(request, "events/event_list.html", {"events": events, "q": q})
def event_detail(request, pk):
event = get_object_or_404(Event, pk=pk)
return render(request, "events/event_detail.html", {"event": event})
def new_event(request):
error = None
if request.method == "POST":
form = EventForm(request.POST)
if form.is_valid():
event = Event.objects.create(
title=form.cleaned_data["title"],
date=form.cleaned_data["date"],
place=form.cleaned_data["place"],
)
return redirect("events:detail", pk=event.pk)
error = "Please check the form."
return render(request, "events/new_event.html", {"error": error, "form": EventForm()})
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
フォームのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド