1

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

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

然而,即使装饰器将字段添加到表单类中,当表单在模板中呈现时,它也不会被包含在内。我缺少一些元类黑魔法。

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

4

1 回答 1

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
于 2014-02-05T10:16:51.000 回答