2013-07-29 66 views
1

我需要將ChoiceField添加到許多不同的表單中,並且選項來自每個表單上的類屬性。每種形式都有自己的一套其他領域。如何使用裝飾器將字段添加到Django表單

我不能把字段放在基類中,因爲那個類沒有選擇屬性,所以我想我可以使用裝飾器將字段添加到每個子類中。

但是,即使裝飾器將該字段添加到窗體類中,當窗體在模板中呈現時,它也不會被包含。有一些元類黑魔法我錯過了。

裝飾者如何將一個字段添加到表單中?

+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 
相關問題