入力のチェック
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 %}チャレンジ
簡単タイトルのないイベントを拒否する:
- タイトルが空か、スペースのみの場合、
new_eventはフォームページを再度表示し、フォームの上にPlease give the event a title.を表示します。また、何も保存しません。 - タイトルを入力したフォームを送信すると、イベントが追加され、そのイベントのページにリダイレクトされます。
「Run」を押して、タイトルにスペースを3つ入力したフォームを送信してください。
自分で試してみよう
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プレイグラウンド