我需要将ChoiceField添加到许多不同的表单中,并且选择来自每个表单上的类属性。每个表单也有自己的一组其他字段。
我不能将该字段放在基类中,因为该类没有choices属性,所以我想我可以使用装饰器将字段添加到每个子类中。
但是,即使装饰器将字段添加到表单类,在表单在模板中呈现时也不会包含该字段。我失踪了一些元类黑魔法。
装饰器如何向表单添加字段?
答案 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