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, а при GET — пустую EventForm.
  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