入力のチェック
CoddyのDjangoジャーニー「フォーム」セクションの一部。レッスン 4/20。
タイトルを空のままフォームを送信すると、ボードには名前のないイベントが追加されます。request.POSTにはどんな値でも届く可能性があるため、ビューは保存する前に内容を確認します。
入力が正しくない場合、ビューは何も保存せず、リダイレクトもしません。メッセージを添えて、フォームページを再度表示します。1〜8人を受け付けるテーブル予約フォームの例です。
guests = request.POST["guests"]
if not guests.isdigit() or not 1 <= int(guests) <= 8:
problem = "Choose between 1 and 8 guests."
return render(request, "tables/book.html", {"problem": problem})
Booking.objects.create(guests=int(guests))確認はcreate()の前に行います。行を保存してしまった後では、メッセージを表示しても手遅れです。テキストの場合、.strip()は両端の空白を取り除くため、空白だけのタイトルは空になります。テンプレートは、メッセージがある場合にだけ表示します。
{% if problem %}
<p class="warning">{{ problem }}</p>
{% endif %}チャレンジ
簡単タイトルのないイベントは登録できないようにします。
events/views.pyのnew_eventで、タイトルが空または空白のみの場合は何も保存せず、メッセージPlease give the event a title.とともにフォームページを再度表示します。タイトルが入力されたフォームの場合は、引き続きイベントを追加してリダイレクトします。new_event.htmlでは、メッセージがある場合にのみフォームの上に表示します。
タイトルに半角スペースを3つ入力します。「Please give the event a title.」と表示され、何も保存されません。
自分で試してみよう
from django.shortcuts import get_object_or_404, redirect, render
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):
if request.method == "POST":
event = Event.objects.create(
title=request.POST["title"],
date=request.POST["date"],
place=request.POST["place"],
)
return redirect("events:detail", pk=event.pk)
return render(request, "events/new_event.html")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
フォームのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド