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

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

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

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