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 — пустую.
  • Удалите сообщение об ошибке из представления и из 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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Формы

Потренируйтесь самостоятельно: Песочница Django