我需要将 ChoiceField 添加到许多不同的表单中,并且选择来自每个表单上的类属性。每个表单也有自己的一组其他字段。
我不能将字段放在基类中,因为该类没有选择属性,所以我想我可以使用装饰器将字段添加到每个子类中。
然而,即使装饰器将字段添加到表单类中,当表单在模板中呈现时,它也不会被包含在内。我缺少一些元类黑魔法。
装饰器如何向表单添加字段?
您必须像这样替换装饰器中的表单构造函数:
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