Django中的组合表单用于父模型

时间:2017-07-20 10:16:20

标签: django django-models django-forms

有很多模型,我已经开始考虑公共块,目的是使我的数据库达到第二范式。由于应用程序应由销售团队使用,因此大多数条目都是某种订单。我的模型文件的摘录如下所示:

class Order(models.Model):
    dl = models.CharField(max_length=100)
    cl = models.CharField(max_length=100)
    (...)

class Setup(models.Model):
    order = models.ForeignKey(Order) # could be OneToOneField()
    name = models.CharField(max_length=200)
    package = models.CharField(choices=(
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
        ('XL', 'Extra large'),
        ('C', 'Custom')
    ), max_length=2)
    server = models.ForeignKey(Webserver)
    (...)

虽然将订单详细信息保留在设置订单的模型之外没有任何合理意义,但它有助于保持项目的可维护性,因为设置订单不是唯一的内容,这样您就可以更改order模型和所有其他模型/订单也会更新。

这就是问题所在。对于像Setup.server这样的属性,Django的默认行为是创建公司可以提供的所有Web服务器的下拉列表。如果团队决定添加另一个,则可以在另一个页面上创建另一个服务器选项。但是对于order,我希望OrderFormSetupForm包含在同一页面上,理想情况下是单独的Fieldset。提交表单后,应将新order添加到数据库中,并填写Setup.order。我知道我可以为这种特殊情况编写代码,但应用程序将包含多种形式,因此通用解决方案会更好。

一种可能的解决方案是使用自定义选项和通用视图创建自定义models.ForeignKeymodels.OneToOneField,而不是使用两种形式呈现模板,然后链接对象。

有没有人有类似的问题?有没有人知道一个简单的,甚至可能是内置的解决方案?

编辑1

我已经考虑inline formsets这是使用此示例的similar question的解决方案

class Contact(models.Model):

    ...

class Communication(models.Model):

   contact = models.ForeignKey(Contact)

并使用通信字段集。但是,这会将包含为子类的类视为我的示例中的情况。但它仍然是一种选择,即使它仍然必须自动化,因此它可以快速用于其他模型之间的所有链接。

0 个答案:

没有答案