【问题标题】:Django model forms - multiple modelsDjango 模型表单 - 多个模型
【发布时间】:2012-03-16 16:03:36
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    对于第二个问题,您需要覆盖您关心的模型表单的 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
    

    还有关于覆盖 clean 的文档:

    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)
    

    如果您的某些模型具有相同的列名,则只需在实例化时使用前缀参数即可。

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

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

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

    【讨论】:

    • 您能否详细说明“我通常使用两个/三个/四个模型形式”的含义?您的意思是在视图中使用单独的模型表单?将模型包装在一个表单中? -- 还有,modelformclean()方法中,cleaned_data是只包含当前记录数据还是所有通过的记录?
    • @RS7,是的,但您也可以随时在表单中查询。我会在一分钟后在我的答案底部添加一个这样的例子。还在这里为您的问题的第一部分编辑了上述内容
    【解决方案2】:

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

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

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

    【讨论】:

    • 那么创建一个通用表单,镜像模型中的字段,创建一个clean() 来检查图像数量并创建一个save() 来为各个模型分配值?我将如何处理/验证 FK 约束?
    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多