ModelForm的元类会阻止添加额外的字段

时间:2014-06-24 16:40:30

标签: python django django-forms metaclass

我正在编写一个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的类模型及其元类保护,但是使用通常适用的类/函数动态地进行吗?

1 个答案:

答案 0 :(得分:0)

您不希望或不需要在fields元组中指定额外字段。您是在__init__中手动添加它们,因此将它们放在fields中是无关紧要的。