如何在 Django 中从 2 个不同的模型对象创建表单对象?

Posted

技术标签:

【中文标题】如何在 Django 中从 2 个不同的模型对象创建表单对象?【英文标题】:How to create a form object from 2 different model objects in Django? 【发布时间】:2010-09-26 17:44:12 【问题描述】:

我有 2 个对象,它们都来自不同的模型类,并且想要显示一个包含每个对象的一些字段的表单。我该怎么做?

【问题讨论】:

【参考方案1】:

我这样做的方法是创建两个ModelForm 类,它们使用fields 元属性来指定要使用哪个subset of fields 在表单中显示。我在模板中显示这两个表单,并在视图中处理它们。

【讨论】:

这是正确的答案。 Django Form/ModelForm 对象不等于 html 表单,它们只是字段的集合;您自己将它们包装在
标记中。不要将所有内容都压缩到一个表单/模型表单中,尽可能多地使用并将它们全部放在一个 HTML 表单中。
【参考方案2】:

只需创建 2 个单独的表单,上面那个人的方法的问题是你会丢失 .save()。表单实际上是代表一组数据,您的每个模型的数据实际上是一组单独的数据。这就是为什么表单在渲染时不包含标签的原因。

【讨论】:

【参考方案3】:

我从未尝试过,但您可以在代码中定义两个 ModelForm 类,然后创建一个新的普通 Form 类,该类在其 __init__ 中创建每个 ModelForm 的副本并将字段复制到自身.

类似:

class DualForm(forms.Form):
    def __init__(self, *args, **kwargs):
        model1 = Model1Form(**kwargs)
        model2 = Model2Form(**kwargs)

        for f in model1.fields:
            self.fields[f] = model1.fields[f]

        for f in model2.fields:
            self.fields[f] = model2.fields[f]

class Model1Form(forms.ModelForm):
    ... your model form...

class Model2Form(forms.ModelForm):
    ... your other model form...

我不明白为什么它不起作用。

只需确保将数据参数传递给ModelForms 并捕获和冒泡异常...我也不确定如果字段名称冲突会发生什么。那可能很麻烦...

【讨论】:

当人们假设所有东西都必须被压缩到一个 Form 对象中时,这些正是容易出错的扭曲......只需使用两个!

以上是关于如何在 Django 中从 2 个不同的模型对象创建表单对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 2.0.4 中从我的专辑模型自动生成 slug

如何在 django 模型中从一个字段添加多个输入

是否可以在 opengl 中从 2 个不同的线程渲染 2 个不同的帧缓冲区对象?

如何在 Blender 中从不同的摄像机角度渲染 3d 模型的不同贴图(漫反射、深度、镜面反射、阴影)?

如何在不同的数据库中使用带有外键的 django 模型?

如何在 django 中从一对多关系中检索数据?