Связанные и несвязанные формы
Часть раздела Формы путешествия по Django на Coddy. Урок 7 из 20.
Отправьте форму с датой next friday: страница возвращается пустой, на ней только «Проверьте форму». Представление создало новую пустую форму, а форма, которую оно проверило, содержала введённые данные.
Форма, созданная с данными, является связанной: ContactForm(request.POST) содержит то, что ввёл посетитель, и после is_valid() — ошибки. ContactForm() является несвязанной: пустой, без ошибок. При отображении с помощью {{ form }} связанная форма показывает каждое значение, а под неверно заполненным полем — ошибку, например Enter a valid date.
Итак, у представления с формой есть три случая:
- GET: отобразить несвязанную форму.
- POST, который завершается ошибкой: отобразить связанную форму, которую оно проверило.
- POST, который проходит проверку: сохранить и перенаправить.
Один вызов render() в конце подходит для первых двух случаев.
Задание
Легко- В
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()})
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Формы
2Формы Django
Форма DjangoСоздание формыПотренируйтесь самостоятельно: Песочница Django