如何使用装饰器向Django Forms添加字段

时间:2013-07-29 22:08:45

标签: python django forms decorator

我需要将ChoiceField添加到许多不同的表单中,并且选择来自每个表单上的类属性。每个表单也有自己的一组其他字段。

我不能将该字段放在基类中,因为该类没有choices属性,所以我想我可以使用装饰器将字段添加到每个子类中。

但是,即使装饰器将字段添加到表单类,在表单在模板中呈现时也不会包含该字段。我失踪了一些元类黑魔法。

装饰器如何向表单添加字段?

1 个答案:

答案 0 :(得分:0)

你必须在装饰器中替换表单的构造函数,如下所示:

def form_with_captcha(orig_form, theme=None):
    if hasattr(orig_form, "captcha"):
        raise ValueError("form already has a field captcha!")
    orig_form.__orig__init__ = orig_form.__init__

    def new_init(self, *args, **kwargs):
        self.__orig__init__(*args, **kwargs)
        self.fields["captcha"] = self.captcha

    orig_form.__init__ = new_init
    orig_form.captcha = ReCaptchaField(attrs={"theme": theme or "white"})
    return orig_form