Как работает функция form_Valid в django? - PullRequest
1 голос
/ 28 апреля 2020

Что это за объект формы в обратной строке, это объект формы, полученный при отправке формы? , и так как мы возвращаем его с возвращением super (). form_valid (form). можно ли получить к нему доступ как к контекстным переменным? из шаблона, представленного success_url. Также form_valid указывает на success_url, так как делал super (), не должен указывать на success_url родительского класса. но почему это go для success_url ContactView.

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()
        return super().form_valid(form)

1 Ответ

1 голос
/ 28 апреля 2020

Что это за объект 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>
...