Menu
CoddyTech

バインド済みフォームと未バインドフォーム

CoddyのDjangoジャーニー「フォーム」セクションの一部。レッスン 7/20。

日付に next friday を指定してフォームを送信すると、ページは空の状態で戻ってきて、「フォームを確認してください。」だけが表示されます。ビューは入力内容を保持したフォームを確認したあと、それを破棄して新しい空のフォームを描画しました。

データを使って作られたフォームはバインド済みです。ContactForm(request.POST) は訪問者が入力した内容を保持し、is_valid() のあとにはエラーも保持します。ContactForm() は未バインドです。空で、エラーもありません。{{ form }} で描画すると、バインド済みフォームには各値が表示され、誤りのあるフィールドの横には Enter a valid date. のようにエラーが表示されます。

つまり、フォームを使うビューには次の3つの場合があります。

  • GET:未バインドのフォームを描画する。
  • 失敗したPOST:確認したバインド済みフォームを描画する。
  • 成功したPOST:保存してリダイレクトする。

最後に render() を1回呼び出せば、最初の2つの場合に対応できます。

challenge icon

チャレンジ

簡単

エラーが発生した後も、訪問者が入力した内容を保持します。

  1. new_eventでは、POSTに失敗した後は確認したフォームを、GETでは空のEventFormを表示します。
  2. ビューとnew_event.htmlからerrorメッセージを削除します。フォーム自体がエラーを表示するようになりました。

日付として next friday を送信します。タイトルはそのまま残り、「有効な日付を入力してください。」がDateボックスの上に表示されます。

自分で試してみよう

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()})
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

フォームのすべてのレッスン

自分で練習してみよう: Djangoプレイグラウンド