添加自定义表单字段参数

时间:2014-09-07 17:12:51

标签: python django

我正在尝试添加自定义表单字段模型参数,但收到错误__init__() got an unexpected keyword argument 'nginit'

我的领域:

self.fields['formdata.name'] = forms.CharField(label = 'Your name', nginit = None, required = True, max_length = 100)

我的子类修饰符:

from django import forms
old_build_field = forms.fields.Field
class build_field(old_build_field):
    def __init__(self, nginit = False, *args, **kwargs):
        super(build_field, self).__init__(*args, **kwargs)
        self.nginit = nginit

forms.fields.Field = build_field

1 个答案:

答案 0 :(得分:0)

据推测,您正在尝试monkeypatch基本Field类,希望像CharField这样的子类将继承新类。不幸的是,这不是它的工作原理。所有类继承都是在导入时执行的,因此CharField将始终继承原始的Field类,而不是monkeypatched版本。

稍微更好的方法是直接monkeypatch Field的__init__方法,因为只有在实例化类时才会调用它。尽管如此,您还需要确保在表单定义本身之前完成了monkeypatching:由于CharField直接在表单级别实例化,因此将再次在导入时完成。但是,只要在表单模块之前完成修改,它就应该可以工作。

我必须说,有可能有更好的方法。例如,您可以直接在表单自己的init方法中为每个字段添加nginit参数。