Django模型形式 - 多个模型

时间:2012-03-16 16:03:36

标签: python django validation django-models django-forms

我有一些模型,例如ListingImage(一对多列表),Category(一对多列表)等等。

我如何拥有处理所有这些模型的表单?另外,我如何强制执行非行特定验证,例如:要求至少三个图像传递/与列表相关联?

2 个答案:

答案 0 :(得分:1)

您可以使用通用表单类为您提供包含一对多字段下拉列表的表单。

要验证表单级别,请参阅此处:https://docs.djangoproject.com/en/dev/ref/forms/validation/#form-and-field-validation

基本上,如果您的所有字段级别验证都通过,django可以检查整个表单是否通过了您施加的测试(至少3张图片)

答案 1 :(得分:1)

使用模型时,我不认为每个模型可以引用多个模型。您可以从forms.Form创建自定义表单来处理验证。当我遇到这种情况时,我通常只使用两个/三个/四个模型,因为我喜欢一致性,它使模板级别的管理更容易。

对于第二个问题,您需要覆盖您关心的modelform的clean()方法。这是我最近写的一个例子:

def clean(self):
    cleaned_data = self.cleaned_data
    npv = cleaned_data.get("npv")
    irr = cleaned_data.get("irr")
    if npv == irr:
        raise forms.ValidationError('Must have either an NPV or IRR entry.')
    if (npv != None) and (irr != None):
        raise forms.ValidationError('Must have only one entry, either NPV or IRR.')
    return cleaned_data

还有关于覆盖清洁的文档:

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overiding-clean-on-a-model-formset

编辑:

由此,“我通常只使用两个/三个/四个模型”我的意思是我为每个模型创建模型。我在视图级别实例化它们,然后将它们作为上下文的一部分发送到模板:

a = ModelFormA()
b = ModelFormB()
c = ModelFormC()

c = {'a':a,'b':b,'c':c}
return rendertoresponse('template.html',c)

如果您的某些模型具有相同的列名,请在实例化时使用prefix参数。

有关前缀的文档可在此处找到:

https://docs.djangoproject.com/en/dev/ref/forms/api/#prefixes-for-forms

然后您可以将request.POST传递到每个模型中,而无需单独解析字段。