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

التحدي

سهل

احتفظ بما كتبه الزائر بعد حدوث خطأ.

  1. في new_event، اعرض النموذج الذي تحققت منه بعد فشل طلب POST، ونموذج EventForm فارغًا عند طلب GET.
  2. أزل رسالة 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()})
quiz iconاختبر نفسك

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

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

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