النماذج المرتبطة وغير المرتبطة
جزء من قسم النماذج في رحلة Django على Coddy. الدرس 7 من 20.
أرسل النموذج مع التاريخ next friday: تعود الصفحة فارغة، ولا يظهر فيها سوى «يرجى التحقق من النموذج». أنشأ العرض نموذجًا جديدًا فارغًا، بينما كان النموذج الذي تحقّق منه يحتوي على التفاصيل.
النموذج المُنشأ باستخدام البيانات هو نموذج مرتبط: يحتوي ContactForm(request.POST) على ما كتبه الزائر، ثم يحتوي على الأخطاء بعد is_valid(). أما ContactForm() فهو نموذج غير مرتبط: فارغ ولا يحتوي على أخطاء. وعند عرضه باستخدام {{ form }}، يعرض النموذج المرتبط كل قيمة، وخطأها أسفل الحقل غير الصحيح، مثل Enter a valid date.
لذا، يتعامل العرض الذي يحتوي على نموذج مع ثلاث حالات:
- طلب GET: اعرض نموذجًا غير مرتبط.
- طلب POST لا يجتاز التحقق: اعرض النموذج المرتبط الذي تحققت منه.
- طلب POST يجتاز التحقق: احفظ البيانات ثم أعد التوجيه.
يكفي استدعاء واحد لـ render() في النهاية للتعامل مع الحالتين الأوليين.
التحدي
سهل- في
new_event، اعرض النموذج الذي جرى التحقق منه بعد فشل طلب POST، ونموذجًا فارغًا عند طلب GET. - أزِل رسالة
errorمن العرض ومنnew_event.html: فالنموذج يعرض أخطاءه بنفسه الآن.
اضغط على Run، وأرسل النموذج بالتاريخ next friday، ثم انظر أسفل التاريخ.
جرّب بنفسك
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