イベントの編集
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で指定し忘れると、保存時にコピーが追加されます。
チャレンジ
簡単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})
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
フォームのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド