تعديل فعالية
جزء من قسم النماذج في رحلة Django على Coddy. الدرس 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، فسيؤدي الحفظ إلى إضافة نسخة.
التحدي
سهلأكمل edit_event في events/views.py باستبدال التعليق. يستدعي render() في النهاية تمرير event بالفعل؛ أضف form بجانبه.
- يعرض طلب GET النموذج معبأً بتفاصيل الفعالية.
- يحفظ طلب POST صالح التغييرات، ولا يضيف فعالية جديدة، ثم يعيد التوجيه إلى صفحتها.
- يعرض طلب POST غير صالح الصفحة مرة أخرى مع الأخطاء.
غيّر المكان إلى قاعة البلدية واضغط على «حفظ التغييرات»: ستعرض صفحة الفعالية قاعة البلدية.
جرّب بنفسك
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})
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس النماذج
تدرّب بنفسك: Playground لـ Django