النماذج المرتبطة وغير المرتبطة
جزء من قسم النماذج في رحلة Django على Coddy. الدرس 7 من 20.
أرسل النموذج بالتاريخ next friday: تعود الصفحة فارغة، ولا يظهر فيها سوى «يرجى التحقق من النموذج». تحقّق العرض من النموذج الذي احتوى على ما كتبته، ثم تخلّص منه وأنشأ نموذجًا جديدًا فارغًا.
النموذج المُنشأ باستخدام بيانات يكون مرتبطًا: يحتفظ ContactForm(request.POST) بما كتبه الزائر، وبعد is_valid()، بالأخطاء أيضًا. أما ContactForm() فهو غير مرتبط: فارغ، بلا أخطاء. عند عرضه باستخدام {{ form }}، يُظهر النموذج المرتبط كل قيمة، وبجوار الحقل غير الصحيح، الخطأ الخاص به، مثل Enter a valid date.
إذًا، للحالة التي يتضمن فيها العرض نموذجٌ ثلاث حالات:
- طلب GET: اعرض نموذجًا غير مرتبط.
- طلب POST لا يجتاز التحقق: اعرض النموذج المرتبط الذي تحقّقت منه.
- طلب POST يجتاز التحقق: احفظ البيانات وأعِد التوجيه.
يكفي استدعاء واحد لـ render() في النهاية للحالتين الأوليين.
التحدي
سهلاحتفظ بما كتبه الزائر بعد حدوث خطأ.
- في
new_event، اعرض النموذج الذي تحققت منه بعد فشل طلب POST، ونموذجEventFormفارغًا عند طلب GET. - أزل رسالة
errorمن العرض ومنnew_event.html: فالنموذج يعرض أخطاءه بنفسه الآن.
أرسل next friday كتاريخ: سيبقى عنوانك، وستظهر عبارة Enter a valid date. أعلى مربع التاريخ.
جرّب بنفسك
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):
error = None
if request.method == "POST":
form = EventForm(request.POST)
if form.is_valid():
event = Event.objects.create(
title=form.cleaned_data["title"],
date=form.cleaned_data["date"],
place=form.cleaned_data["place"],
)
return redirect("events:detail", pk=event.pk)
error = "Please check the form."
return render(request, "events/new_event.html", {"error": error, "form": EventForm()})
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس النماذج
2نماذج Django
نموذج في Djangoعرض نموذجتدرّب بنفسك: Playground لـ Django