Menu
CoddyTech

入力のチェック

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 %}
challenge icon

チャレンジ

簡単

タイトルのないイベントは登録できないようにします。

  1. events/views.pyのnew_eventで、タイトルが空または空白のみの場合は何も保存せず、メッセージPlease give the event a title.とともにフォームページを再度表示します。タイトルが入力されたフォームの場合は、引き続きイベントを追加してリダイレクトします。
  2. 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")
quiz icon腕試し

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

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

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