تعديل فعالية
جزء من قسم النماذج في رحلة 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:
- يعرض طلب 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})
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس النماذج
تدرّب بنفسك: Playground لـ Django