我正在编写一个mixin类来动态地将额外的字段添加到ModelForm中,并对其进行子类化。
新字段是在mixin的__init__
方法中生成的。见下文:
mixin类代码(强烈缩短和简化):
class ForeignFieldsMixin(object):
# …
def __init__(self, *args, **kwargs):
# …
instance = kwargs.get('instance')
self.fields[extra_field_name] = fields_for_model(fmodel, (fldname,))
# ^^^^^^ here a new field instance is added
self.fields[extra_field_name].initial = 'some value'
# ^^^^^^ here is set an inital value for the new field
# …
但是,form的类仍然拒绝在Meta.fields
:
class ContactAdminForm(ForeignFieldsMixin, forms.ModelForm):
# …
class Meta:
model = Contact
fields = ('title', 'extra_field_name',)
并因以下异常而失败
File "../lib/python2.7/site-packages/django/forms/models.py", line 215, in __new__
raise FieldError(message)
FieldError: Unknown field(s) (extra_field_name) specified for Contact
我确实在类定义时怀疑ModelForm's
元类(或其某些祖先),即。在实例化类之前会引发此异常,因为它还不知道添加了新的字段名称。
我不知道我是否从错误的方面采取这一点,因为该领域的文档相当稀少。我真的很想避免对ModelForm's
元类进行猴子修补。
还有其他一些方法可以模拟基本的代码字段定义,以满足Django的类模型及其元类保护,但是使用通常适用的类/函数动态地进行吗?
答案 0 :(得分:0)
您不希望或不需要在fields
元组中指定额外字段。您是在__init__
中手动添加它们,因此将它们放在fields
中是无关紧要的。