form_Valid 函数在 django 中是如何工作的?
Posted
技术标签:
【中文标题】form_Valid 函数在 django 中是如何工作的?【英文标题】:How the form_Valid function works in 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)
【问题讨论】:
【参考方案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.POST
和request.FILES
的ContactForm
,并检查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 是 CreateView
和 UpdateView
。这些在ModelForm
s 上工作,从而创建或更新记录。以上是关于form_Valid 函数在 django 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
使用 FormView django 在 form_valid 中渲染模板而不是 success_url
__eq__ 在 Python 中是如何处理的以及按啥顺序处理?
如何使用测试客户端测试 django (3.0) CreateView 的“form_valid”方法和参数?
Django:如何在新模板中的另一个模型上使用 CreateView 的 form_valid() 返回的响应?
python Django(极端情况):如何在FormView(CreateView / UpdateView)的form_valid方法中引发表单无效并添加错误消息