【问题标题】:django model form clean method with foreign key带有外键的django模型表单清理方法
【发布时间】:2016-04-16 00:03:08
【问题描述】:

我尝试用外键覆盖模型表单的清理方法。

型号:

 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:“名称”。如果我从 msg 中删除 self.cleaned_data['name'] - 我 不要得到 self.cleaned_data['doc_type']。

我哪里错了?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

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

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

    当表单的 clean() 方法被调用时,所有的个体 将运行字段清理方法(前两节),所以 self.cleaned_data 将填充任何幸存的数据,因此 远的。所以你还需要记住考虑到 您要验证的字段可能无法在初始状态下存活 单独的现场检查。

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

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

    【讨论】:

    • 我已经在我的答案中分享了链接,也许你需要阅读整个页面,它不是很多。它解释了如何验证 django 表单。你不应该再使用你的方式了,它保证不起作用。
    • 也许可以查看详细解释的答案:stackoverflow.com/questions/7948750/custom-form-validation
    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多