Menu
CoddyTech

イベントの編集

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

各イベントページに、/events/1/edit/へのこのイベントを編集リンクが追加されました。URL、リンク、テンプレートの準備はできており、edit_eventはすでにURLが指定するイベントを見つけています。ビューの残りはあなたの担当です。

ModelFormに既存の行をinstanceとして渡すと、その行を編集できます。メモアプリのメモの場合は、次のようになります。

note = get_object_or_404(Note, pk=4)

form = NoteForm(instance=note)                # このノートの値が入力済み

form = NoteForm(request.POST, instance=note)  # このノートに対する新しい値
if form.is_valid():
    form.save()                               # ノート 4 を更新し、行は追加しない

データがない場合、NoteForm(instance=note)は現在の行の値が入力されたフォームを表示します。データがある場合、instance=noteによって、form.save()は新しい行を作成するのではなく、その行を更新します。

編集ページには両方が必要です。GETでインスタンスを渡し忘れると、訪問者には空のフォームが表示されます。POSTで渡し忘れると、保存時にコピーが追加されます。

challenge icon

チャレンジ

簡単

events/views.py の edit_event を完成させましょう。

  • GET リクエストでは、イベントの詳細が入力されたフォームを表示します。
  • 有効な POST リクエストでは、このイベントへの変更を保存し、新しいイベントは追加せず、そのイベントのページにリダイレクトします。
  • 無効な POST リクエストでは、エラーとともにページを再表示します。

テンプレートには form と event が必要です。「実行」を押してから、「このイベントを編集」を押してください。

自分で試してみよう

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):
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save()
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm()
    return render(request, "events/new_event.html", {"form": form})


def edit_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    # new_event と同様に、このイベントのフォームを作成し、検証して保存します。
    return render(request, "events/edit_event.html", {"event": event})
quiz icon腕試し

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

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

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