イベントの編集
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 を完成させましょう。
- 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})
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
フォームのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド