当前位置:  开发笔记 > 后端 > 正文

带有外键的Django模型形式清除方法

如何解决《带有外键的Django模型形式清除方法》经验,为你挑选了1个好方法。

我尝试使用外键覆盖模型形式的clean方法。

模型:

 Doc(Model):
   name = CharField()
   doc_type = ForeignKey(DictDocType)

形成:

    class DocForm(ModelForm):

      class Meta:
        model = Doc
        fields = '__all__'

      def clean_doc_type(self)
        doc_type_name = self.cleaned_data['doc_type']

        try:
            DictDocType.objects.get(name=doc_type_name)
        except DictDocType.DoesNotExist:
            msg = '{0} does not exist in dictdoc {1}.'.format(
                doc_type_name, self.cleaned_data['name'])
            raise ValidationError(msg)
        return name

在测试中,我得到一个错误:

KeyError:“名称”。如果我从味精中删除self.cleaned_data ['name']-我不会得到self.cleaned_data ['doc_type']。

我哪里错了?



1> Shang Wang..:

您不能交叉引用clean_foo方法中的其他字段,因为clean_foo当您位于其中一个字段中时,并不是所有字段的方法都被调用。表单中的某些值可能尚未填充,因此clean_name()在您调用时尚未调用clean_doc_type(),因此您没有self.cleaned_data['name']

这应该在clean方法中完成。Django文档非常明确地记录了这一点:

到窗体的clean()方法被调用时,所有单独的字段clean方法都将运行(前两节),因此self.cleaned_data将填充有迄今为止尚存的任何数据。因此,您还需要记住考虑到以下事实:您要验证的字段可能无法在最初的单个字段检查中幸免。

而且,您的干净方法没有太大意义,根本没有必要。您将无法选择foreignkey中不存在的ModelForm。即使您强制前端这样做,该字段也会自动使验证失败并给出错误:

选择一个有效的选择。foo不是可用的选择之一。

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有