【问题标题】:How the form_Valid function works in django?form_Valid 函数在 django 中是如何工作的?
【发布时间】:2020-08-12 15:54:39
【问题描述】:

返回行上的这个表单对象是什么,是提交表单时收到的表单对象吗? .因为我们用 return super().form_valid(form) 返回它。 可以像上下文变量一样访问它吗?从 success_url 表示的模板中,form_valid 也指向了 success_url ,因为正在执行 super() ,所以它不应该指向父类的 success_url 。但是为什么会转到ContactView的success_url。

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)

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:

    返回线上的form 对象是什么?

    form 是 Django 为验证 POST 请求而构建的 ContactForm 实例。因此,您可以使用以下方法从表单中获取已清理的数据:

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

    FormView 将因此构造一个带有request.POSTrequest.FILESContactForm,并检查form.is_valid()。如果是,它将使用此表单实例调用form_valid

    既然在做super(),不应该指向父类的success_url。

    super() 是一个代理对象,它将向上移动 MRO 并因此调用父方法,但该父方法是 implemented as [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]。这样你就可以提供视图的name,Django可以自动计算出URL:

    from django.urls import reverse_lazy
    
    class ContactView(FormView):
        template_name = 'contact.html'
        form_class = ContactForm
        success_url = reverse_lazy('name-of-thanks-view')

    【讨论】:

    • 谢谢,还有 def form_valid(self, form) 的代码:你在上面分享的 github ,函数内部没有处理表单的代码。那个代码像指南吗?如果不是,该函数如何确定表单对象是有效的。
    • @dickshant69:在FormView 中,确实没有处理表单,这应该由FormView 的用户完成,因此您可以像发送邮件一样发送邮件。两个受欢迎的 newphew 是 CreateViewUpdateView。这些在ModelForms 上工作,从而创建或更新记录。
    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 2016-04-30
    • 1970-01-01
    • 2021-09-22
    • 2018-12-12
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多