Django:is_valid 和 form_valid 之间的区别

Posted

技术标签:

【中文标题】Django:is_valid 和 form_valid 之间的区别【英文标题】:Django: difference between is_valid and form_valid 【发布时间】:2016-03-27 07:50:31 【问题描述】:

我创建了一个forms.ModelForm 表单。在“视图”方面,我创建了一个 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'01'.format(
            site_web, self.request.META['PATH_INFO']
        ))

我的表单显示了 3 个不同模型的 3 个字段:

User, Person 有一个 User 的外键 PicturePerson 有一个外键

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

generic.UpdateView 应该在更新字段时帮助我们,但似乎当您有不属于您编辑的model 的字段时,您必须编写 all 的“更新”手。

【问题讨论】:

【参考方案1】:

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)

运行验证并返回指定数据是否有效的布尔值:

运行验证是因为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

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

form_valid 方法中,因为此时您已发现您的验证已验证更新模型是安全的。

【讨论】:

@OlivierPons - 别担心,尽情享受吧! @OlivierPons - 它有点棘手,可能需要一个新问题才能得到答案......我会考虑在你将文件保存在某个地方之前验证文件,假设你正在使用临时文件按照 django 默认上传存储 我在你回答的时候添加了我的问题.. :^D 我们去 >> ***.com/questions/34397856/…

以上是关于Django:is_valid 和 form_valid 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

ajax 形式 is_valid 返回 false (django)

当值为空时,Django modelSerializer form.is_valid() 为真

Django 表单不运行 form.is_valid

django form.is_valid 返回 false

Django——form组件is_valid校验机制

Django 表单 is_valid() 失败