我尝试使用外键覆盖模型表单的清理方法。
型号:
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:' name'。如果我从msg中移除self.cleaned_data [' name'] - 我 不要得到self.cleaned_data [' doc_type']。
我哪里错了?
答案 0 :(得分:3)
您无法在clean_foo
方法中交叉引用其他字段,因为当您在其中一个方法中时,并非所有字段都会调用clean_foo
方法。可能还有一些尚未填充的表单值,因此在您调用clean_name()
时尚未调用clean_doc_type()
,因此您没有self.cleaned_data['name']
。
这应该在clean
方法中完成。 Django doc非常明确地记录了这一点:
当调用表单的clean()方法时,所有个体 将运行字段清理方法(前两节),所以 self.cleaned_data将填充任何幸存下来的数据 远。所以你还需要记住允许的事实 您想要验证的字段可能无法在初始阶段幸存 个别实地考察。
此外,您的清洁方法没有多大意义,根本没有必要。您无法选择foreignkey
中不存在的ModelForm
。即使您强制前端执行此操作,该字段也会自动验证失败并给出错误:
选择有效的选择。 foo不是可用的选择之一。