Django ModelForm:从ModelForm中排除必填字段

时间:2012-02-23 14:24:25

标签: python django forms modelform

假设我有一堆模型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类。

0 个答案:

没有答案