【问题标题】:Django save different objects in a single viewDjango 在单个视图中保存不同的对象
【发布时间】:2017-07-08 05:14:04
【问题描述】:

我需要在我展示的地方渲染一个视图:

  • 模型 A 的一种形式。
  • 模型 B 有多种形式。它与 A 有一个 FK。

一旦用户点击保存,模型 A 和所有模型 B 应该被保存。然后,在正确更新字段的情况下呈现相同的视图。

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

我正在尝试使用 FormView 来实现此视图,它为模型 A 呈现 ModelForm,为模型 B 呈现表单集,但没有运气。这是解决这种情况的正确方法吗?什么样的formset更适合?

【问题讨论】:

  • 你能给我一个你为什么需要这样做的理由吗,你到底想创造什么?

标签: django django-forms formset


【解决方案1】:

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

  1. get - 初始化所有需要的表单并将它们传递给上下文
  2. post - 处理表单发送的数据(使用 self.request.POST 初始化表单并验证它们)
  3. form_valid - 继续使用有效的表单
  4. form_invalid - 继续使用无效表单

每个对象都应该定义其 ModelForm 类(在 forms.py 中)。如果一个类的多个表单与另一个类的实例相关,则应该使用 Django 表单集。

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

调用所有表单

步骤如下:

  1. 为 forms.py 中的每个类创建 ModelForm 类
  2. 在 views.py 中使用 CreateView 和 UpdateView 为主类创建视图(其他类相关)
  3. 在主类的表单类中重写init方法,使其初始化其他相关类的表单,并将它们全部放在main中以使用FormHelper和Layout
  4. 覆盖同一类中的 is_valid 方法,使其在所有表单上调用 is_valid
  5. 覆盖同一类中的 save 方法,使其在所有表单上调用 save

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-04
    • 2023-03-31
    • 2020-08-31
    • 1970-01-01
    • 2012-08-09
    • 2017-04-12
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多