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 を完成させるため、コメントを置き換えます。最後の render() にはすでに event が渡されているので、その隣に form を追加します。

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

Place を Town Hall に変更して「変更を保存」を押すと、イベントのページに Town Hall と表示されます。

自分で試してみよう

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プレイグラウンド