Django在单个视图中保存不同的对象

Django在单个视图中保存不同的对象,django,django-forms,formset,Django,Django Forms,Formset,我需要渲染一个视图,其中显示: 模型A的一种形式 模型B有多个表单。它有一个FK到a 一旦用户单击“保存”,模型A和所有模型B都应保存。然后,在正确更新字段的情况下渲染相同的视图 有一种特殊情况,该视图必须是init,模型B表单中填充了来自另一个模型(C)的数据 我试图使用FormView来实现这个视图,它为模型a呈现了一个模型表单,为模型B呈现了一个表单集,但运气不好。对于这种情况,这是正确的方法吗?什么样的表单集更合适?有几种方法。您可以使用FormView,也可以使用CreateVie

我需要渲染一个视图,其中显示:

  • 模型A的一种形式
  • 模型B有多个表单。它有一个FK到a
一旦用户单击“保存”,模型A和所有模型B都应保存。然后,在正确更新字段的情况下渲染相同的视图

有一种特殊情况,该视图必须是init,模型B表单中填充了来自另一个模型(C)的数据


我试图使用FormView来实现这个视图,它为模型a呈现了一个模型表单,为模型B呈现了一个表单集,但运气不好。对于这种情况,这是正确的方法吗?什么样的表单集更合适?

有几种方法。您可以使用FormView,也可以使用CreateView和UpdateView。如果有多个表单,则至少需要覆盖视图中的四种方法:

  • 获取-初始化所有需要的表单并将其传递给上下文
  • post-处理表单发送的数据(使用self.request.post初始化表单并验证它们)
  • 表格\u有效-继续使用有效表格
  • 表格\u无效-继续使用无效表格
  • 每个对象都应该定义其ModelForm类(在forms.py中)。如果一个类的多个表单与另一个类的实例相关,则应使用Django表单集

    您还可以尝试将所有逻辑放在form类中,并在视图中使用最少的代码。这是我在使用脆皮形式时的首选方式,我认为它更短更干净。在主类的ModelForm类中,我初始化所有其他表单并将POST数据传递给它们。使用crispy_表单,我将所有表单放在主表单中(使用FormHelper和Layout),以便通过单个{%crispy form%}调用模板中的所有表单

    这些步骤是:

  • 为forms.py中的每个类创建ModelForm类
  • 使用CreateView和UpdateView在views.py中为主类(与其他类相关的类)创建视图
  • 在main类的form类中,重写init方法,以便它初始化其他相关类的表单,并将它们全部放在main中,以便使用FormHelper和Layout
  • Overwrite是同一类中的有效方法,因此它在所有窗体上调用is\u valid
  • 覆盖同一类中的save方法,使其在所有窗体上调用save

  • 你能给我一个你为什么要这么做的原因吗?你到底想创造什么?