我有以下型号:
class Model1(models.Model):
field1 = ...
field2 = ...
class Meta:
abstract = True
class Model2(models.Model):
field3 = ...
field4 = ...
class Meta:
abstract = True
我有上述的具体实现:
class ConcreteModel1(Model1):
field1_group = ... # foreign key to ConcreteModel3
class ConcreteModel2(Model2):
field3_test = ... # foreign key to ConcreteModel4
我有抽象的 ModelForms:
class Model1Form(ModelForm):
class Meta:
widgets = { ... }
abstract = True
class Model2Form(ModelForm):
class Meta:
widgets = { ... }
abstract = True
我有具体的 ModelForms:
class ConcreteModel1Form(Model1Form):
class Meta(Model1Form.Meta):
model = ConcreteModel1
exclude = ('field1_group')
class ConcreteModel2Form(Model2Form):
class Meta(Model2Form.Meta):
model = ConcreteModel2
exclude = ('field3_test')
现在您可以看到两种模型形式之间存在相似之处。问题是在我的模板中 field1 对 ConcreteModel1Form 可见(预期行为)但在另一个模板中 field3 对于 ConcreteModel2Form 不可见(意外行为)。
如果我注释掉 exclude=('field3_test') 则 field3 在模板中可见(预期行为)但表单验证失败,因为 field3_test 为 None 并且是必填字段。
我错过了什么?这似乎是我无法弄清楚的代码的问题。这种行为显然不一致,我无法看到我的代码中的差异。
任何想法如何调试这个?可能是什么问题呢?
我尝试从基本表单类中删除 abstract=True ,但没有帮助。
但是,在 ConcreteModelForm 类中显式指定字段列表是可行的。但我不明白为什么排除列表适用于一种情况而不适用于另一种情况。