Menu
CoddyTech

النماذج المرتبطة وغير المرتبطة

جزء من قسم النماذج في رحلة Django على Coddy. الدرس 7 من 20.

أرسل النموذج مع التاريخ next friday: تعود الصفحة فارغة، ولا يظهر فيها سوى «يرجى التحقق من النموذج». أنشأ العرض نموذجًا جديدًا فارغًا، بينما كان النموذج الذي تحقّق منه يحتوي على التفاصيل.

النموذج المُنشأ باستخدام البيانات هو نموذج مرتبط: يحتوي ContactForm(request.POST) على ما كتبه الزائر، ثم يحتوي على الأخطاء بعد is_valid(). أما ContactForm() فهو نموذج غير مرتبط: فارغ ولا يحتوي على أخطاء. وعند عرضه باستخدام {{ form }}، يعرض النموذج المرتبط كل قيمة، وخطأها أسفل الحقل غير الصحيح، مثل Enter a valid date.

لذا، يتعامل العرض الذي يحتوي على نموذج مع ثلاث حالات:

  • طلب GET: اعرض نموذجًا غير مرتبط.
  • طلب POST لا يجتاز التحقق: اعرض النموذج المرتبط الذي تحققت منه.
  • طلب POST يجتاز التحقق: احفظ البيانات ثم أعد التوجيه.

يكفي استدعاء واحد لـ render() في النهاية للتعامل مع الحالتين الأوليين.

challenge icon

التحدي

سهل
  • في 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()})
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس النماذج

تدرّب بنفسك: Playground لـ Django