【问题标题】:Django form to create several objects with one-to-one relationDjango 表单创建多个具有一对一关系的对象
【发布时间】:2015-04-21 22:49:19
【问题描述】:

我有几个具有一对一关系的模型。例如

class Task(models.Model):
     initial_comment = models.OneToOneField('Comment')
     # A pack of other fields

class Comment(models.Model)
    body = RichTextField()
    # A pack of other fields

我想基于表单创建“创建视图”,让用户能够在那里创建任务和初始评论。

  • 我不能使用CreateView,因为它只基于一个模型
  • 我不能使用ModelForm,因为它只基于一个模型
  • 我可以创建多个表单,但我无法将它们加入一个表单集(表单不同)
  • 我觉得这里应该使用“inlineformset_factory”(InlineFormSet),但我不确定它是否最适合。是否有任何 3rd 方 Django 应用可以做到这一点?

当然我可以自己创建表单,但我不想复制/粘贴所有字段、它们的类型、本地化标签、验证等。我只想列出他们的名字(比如fields attibute)。

我也可以有 2 个表单并在任何地方都支持它们并手动跟踪依赖项(首先保存 cmets),就像在 How can create a model form in django with a one-to-one relation with another model 中一样,但我希望必须有更好的解决方案。

如果你想知道为什么我需要一对一:评论在其他地方被大量使用,并且与不同的模型有不同的关系。

【问题讨论】:

    标签: python django


    【解决方案1】:

    inline_formset 工厂是正确的。对此没有标准的通用视图,但是有一个带有通用视图的第三方包来做你想要的。它采用标准的 Django 做事方式。

    https://github.com/AndrewIngram/django-extra-views

    您可能希望为此使用 CreateWithInlinesView。

    【讨论】:

    • 谢谢,但此视图需要 Comment(在我的示例中)才能拥有 Task 的外键,这不是我的情况。 Django 中的内联表单集也支持外键,但不支持一对一关系..
    【解决方案2】:

    嗯,我找到了解决办法。

    CreateWithInlinesViewOneToOneField 完美配合(毕竟,1-to-1 只是一个带约束的外键),但我这里的主要模型是Comment,而不是Task。所以我应该在这个视图中将Comment 设置为model 字段,并将Task 设置为inline。看起来很傻。我将创建自定义表单或查看我的模型结构。

    【讨论】:

      猜你喜欢
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2013-02-17
      相关资源
      最近更新 更多