Что это за объект form
в строке возврата?
form
- это экземпляр ContactForm
, который Django создан для проверки запроса POST. Таким образом, например, вы можете получить очищенные данные из формы с помощью:
class ContactView(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = '/thanks/'
def form_valid(self, form):
# This method is called when valid form data has been POSTed.
# It should return an HttpResponse.
form.send_email()
print(<b>form.cleaned_data</b>)
return super().form_valid(form)
. Таким образом, FormView
создаст ContactForm
с request.POST
и request.FILES
и проверит form.is_valid()
. Если это так, он вызовет form_valid
с этим экземпляром формы.
, поскольку он делал super()
, не должен ли он указывать на success_url родительского класса.
Нет . super()
- это прокси-объект, который будет перемещаться вверх по MRO и, таким образом, вызывать родительский метод, но этот родительский метод реализован как [GitHub] :
def form_valid(self, form):
"""If the form is valid, redirect to the supplied URL."""
return HttpResponseRedirect(self.get_success_url())
Однако объект self
по-прежнему является объектом ContactView
, поэтому self.get_success_url()
вернет success_url
.
Часто, однако, reverse_lazy
[ Django -doc] используется. Таким образом, вы можете указать имя представления, а Django может автоматически рассчитать URL:
from django.urls import <b>reverse_lazy</b>
class ContactView(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = <b>reverse_lazy(</b><i>'name-of-thanks-view'</i><b>)</b>