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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה טפסים

תרגלו בעצמכם: Django אונליין