用于inlineformset的Django覆盖抽象字段

时间:2015-06-10 17:06:51

标签: django forms inheritance model

简介

您好!!!!!我已经找到了解决这个问题的方法 - 到目前为止我发现的最近的事情是this,而且我没有足够的答案。

背景

以下是一个让我的问题更清楚的人为例子。

我感兴趣的是在表单中的每个条目可以对应于同一父模型的不同子类的情况下使用inlineformset_factory。例如,假设我有一个包含许多输入项的表单模型:

class Form(models.Model):
    name = models.CharField(max_length=30)

然后,我有一个Input模型及其子类:

class Input(models.Model):
    class Meta:
        abstract = True

    form = models.ForeignKey(Form)
    name = models.CharField(max_length=30)

class ShortInput(Input):
    value = models.CharField(max_length=20)

class TweetInput(Input):
    value = models.CharField(max_length=140)

class BinaryInput(Input):
    value = models.TextField(blank=True)

基本上,它是包含各种类型数据的表单。重要的是ShortInput个实例在后端只占用20个字符的空间,而BinaryInput个实例拥有大量的存储空间。另请注意,Input的每个子类都将始终具有value字段,但它们可能具有不同的长度/类型。

我现在要做的是使用inlineformset_factory来构建Form模型。看起来像这样:

form = inlineformset_factory(
    Form,
    Input,
    fk_name='form',
    fields=['value']
)

这里的目的是构建一个表单,我可以在其中编辑数据库中每个Input条目的值。

问题

对于inlineformset_factory来电,Django抱怨Input没有名为value的字段。

问题

我觉得我应该能够处理这个问题,因为我可以保证每个Input子类 都有value属性 - 我只需要告诉Django某种程度上来说。我正在寻找的理想之处是:

class Input(models.Model):
    class Meta:
        abstract = True
        guaranteed_subclass_fields = [
            'value',
        ]
    ...

换句话说,一种告诉Django的方法,它可以在子类中期望value字段。

我正在寻找的另一个最好的方法是向Django指定它可以依赖现有的value字段。

最后,如果这一切都不可能,我正在寻找一些其他(可能是hackish)方式将我的Input课程带有value字段传递给inlineformset_factory功能 - 可能忽略错误或类似的东西。 (虽然无论解决方案多么具体,但我希望它涉及使用inlineformset_factory

提前感谢您的帮助!

0 个答案:

没有答案