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 个字段:

我应该在哪里创建更新这些字段的代码,为什么?

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 方法中,因为此时您已经发现您的验证已验证更新模型是安全的。