假设我有一堆模型M_1,...,M_n,...,M_2n,所以共有2n个型号。前n个模型中的每一个都具有(必需的)外键,其引用最后n个模型的模型。所以:假设模型M_x具有到模型M_2x的(必需的)外键FK_x,其中1 <= x <= n。
对于每个模型M_x(1 <= x <= n),我现在想要具有模型形式MF_x。我要求MF_x排除外键FK_x,这样FK_x不会出现在表单中。由于FK_x是必填字段,我要求在表单实例化中提供该字段,如下所示:
model_2x_instance = M_2x.objects.create(**some_data)
model_x_instance = M_x(FK_x=model_2x_instance, ...)
form_x_instance = MF_x(instance=model_x_instance)
MF_x的__init__然后执行以下操作以检查是否给出了'instance'参数并且具有到模型M_2x集的外键FK_x:
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance', None)
if not instance:
raise InstanceRequiredError
if not hasattr(instance, 'FK_x') or not instance.FK_x:
raise ForeignKeyRequiredError
...
MF_x的clean方法然后将排除的FK_x注入到clean_data字典中,以便表单可以创建/修改M_x实例:
def clean(self):
self.cleaned_data.update(FK_x=self.instance.FK_x)
return super(...).clean()
现在的问题是,我不想为每个模型表单重复两个代码片段。但我想不出一种巧妙的方法来重构这一点,以至于一切都干了。
如果我可以写这样的东西:
class Meta:
exclude_but_require_and_inject_later = 'FK_x'
所有模型形式的公共基类MF_x(1&lt; = x&lt; = n)可以对每个这样的排除字段应用上面的代码片段。但是(合理地)不可能用自己的关键字扩展Meta类。