Django:is_valid 和 form_valid 之间的区别
Django: difference between is_valid and form_valid
我创建了一个 forms.ModelForm
表单。在 "view" 方面,我创建了一个 generic.UpdateView
.
视图
在这 2 个不同的 类 中,我的一侧是 is_valid()
,另一侧是 form_valid()
。
class ProfileForm(FormForceLocalizedDateFields):
class Meta:
model = Personne
fields = ('sexe', 'statut', 'est_fumeur',
'est_physique', 'date_naissance')
exclude = ('user', 'est_physique')
# blabla fields declaration
def is_valid(self):
pass
并编辑视图:
class EditView(LoginRequiredMixin, generic.UpdateView):
model = Personne
template_name = 'my_home/profile/edit.html'
form_class = ProfileForm
success_url = reverse_lazy('my_home_index')
# blabla get_initial() and get_object() and get_context_data()
def form_valid(self, form):
# username = form.cleaned_data['username']
# Hack: redirect on same URL:
# - if user refreshes, no form re-send
# - if user goes back, no form re-send too, classical refresh
site_web = u"{0}://{1}".format(
self.request.scheme, self.request.META['HTTP_HOST']
)
return HttpResponseRedirect(u'{0}{1}'.format(
site_web, self.request.META['PATH_INFO']
))
我的表格显示了 3 个不同模型的 3 个字段:
User
,
Person
有一个指向 User 的外键
Picture
有 Person
的外键
我应该在哪里创建更新这些字段的代码,为什么?
generic.UpdateView
应该在更新字段时帮助我们,但似乎当您有不属于您编辑的 model
的字段时,您必须写 all 手写 "update".
is_valid
表面上只是告诉你表格是否有效,这是它应该做的唯一工作..
来自source code:
def is_valid(self):
"""
Returns True if the form has no errors. Otherwise, False. If errors are
being ignored, returns False.
"""
return self.is_bound and not self.errors
在此之下,它还做的是(来自docs)
run validation and return a boolean designating whether the data was valid:
验证是 运行,因为 errors
是一个 属性,如果尚未调用验证,它将调用 full_clean
。
@property
def errors(self):
"Returns an ErrorDict for the data provided for the form"
if self._errors is None:
self.full_clean()
return self._errors
Where should I create the code that update those fields, and why?
在 form_valid
方法中,因为此时您已经发现您的验证已验证更新模型是安全的。
我创建了一个 forms.ModelForm
表单。在 "view" 方面,我创建了一个 generic.UpdateView
.
在这 2 个不同的 类 中,我的一侧是 is_valid()
,另一侧是 form_valid()
。
class ProfileForm(FormForceLocalizedDateFields):
class Meta:
model = Personne
fields = ('sexe', 'statut', 'est_fumeur',
'est_physique', 'date_naissance')
exclude = ('user', 'est_physique')
# blabla fields declaration
def is_valid(self):
pass
并编辑视图:
class EditView(LoginRequiredMixin, generic.UpdateView):
model = Personne
template_name = 'my_home/profile/edit.html'
form_class = ProfileForm
success_url = reverse_lazy('my_home_index')
# blabla get_initial() and get_object() and get_context_data()
def form_valid(self, form):
# username = form.cleaned_data['username']
# Hack: redirect on same URL:
# - if user refreshes, no form re-send
# - if user goes back, no form re-send too, classical refresh
site_web = u"{0}://{1}".format(
self.request.scheme, self.request.META['HTTP_HOST']
)
return HttpResponseRedirect(u'{0}{1}'.format(
site_web, self.request.META['PATH_INFO']
))
我的表格显示了 3 个不同模型的 3 个字段:
User
,Person
有一个指向 User 的外键
Picture
有Person
的外键
我应该在哪里创建更新这些字段的代码,为什么?
generic.UpdateView
应该在更新字段时帮助我们,但似乎当您有不属于您编辑的 model
的字段时,您必须写 all 手写 "update".
is_valid
表面上只是告诉你表格是否有效,这是它应该做的唯一工作..
来自source code:
def is_valid(self):
"""
Returns True if the form has no errors. Otherwise, False. If errors are
being ignored, returns False.
"""
return self.is_bound and not self.errors
在此之下,它还做的是(来自docs)
run validation and return a boolean designating whether the data was valid:
验证是 运行,因为 errors
是一个 属性,如果尚未调用验证,它将调用 full_clean
。
@property
def errors(self):
"Returns an ErrorDict for the data provided for the form"
if self._errors is None:
self.full_clean()
return self._errors
Where should I create the code that update those fields, and why?
在 form_valid
方法中,因为此时您已经发现您的验证已验证更新模型是安全的。