Menu
CoddyTech

التحقق من المدخلات

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

أرسل النموذج بعنوان فارغ، وستظهر في لوحة الأحداث فعالية بلا اسم. قد يصل أي شيء في request.POST، لذا تتحقق دالة العرض منه قبل الحفظ.

عندما تكون المدخلات غير صحيحة، لا تحفظ دالة العرض شيئًا ولا تعيد التوجيه: بل تعرض صفحة النموذج مرة أخرى مع رسالة. نموذج حجز طاولة يقبل من ضيف واحد إلى 8 ضيوف:

guests = request.POST["guests"]
if not guests.isdigit() or not 1 <= int(guests) <= 8:
    problem = "Choose between 1 and 8 guests."
    return render(request, "tables/book.html", {"problem": problem})
Booking.objects.create(guests=int(guests))

يأتي التحقق قبل create(): فبعد حفظ الصف، تكون الرسالة قد جاءت متأخرة. وبالنسبة إلى النص، تزيل .strip() المسافات من الطرفين، لذا يصبح العنوان المكوّن من مسافات فقط فارغًا. يعرض القالب الرسالة فقط عند وجودها:

{% if problem %}
<p class="warning">{{ problem }}</p>
{% endif %}
challenge icon

التحدي

سهل

ارفض الفعالية إذا لم يكن لها عنوان.

  1. في new_event في events/views.py، عندما يكون العنوان فارغًا أو يحتوي على مسافات فقط، لا تحفظ أي شيء واعرض صفحة النموذج مجددًا مع الرسالة Please give the event a title.. يظل النموذج الذي يحتوي على عنوان يضيف الفعالية ويعيد التوجيه.
  2. في new_event.html، اعرض الرسالة أعلى النموذج، ولكن فقط عند وجودها.

أرسل عنوانًا مكوّنًا من ثلاث مسافات: ستظهر لك الرسالة Please give the event a title. ولن يُحفَظ أي شيء.

جرّب بنفسك

from django.shortcuts import get_object_or_404, redirect, render

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":
        event = Event.objects.create(
            title=request.POST["title"],
            date=request.POST["date"],
            place=request.POST["place"],
        )
        return redirect("events:detail", pk=event.pk)
    return render(request, "events/new_event.html")
quiz iconاختبر نفسك

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

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

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