2011-04-21 153 views
3
class Test(forms.Form): 

    def set_choices(self, choices): 
     self.choices = choices 

    def get_choices(self): 
     return self.choices 

    options = forms.ChoiceField(choices=get_choices()) 

f = Test() 
f.set_choices(...) 

爲什麼不可能這樣?
我還能如何實現將數據傳遞到類Test的目標?
在此先感謝。將數據傳遞到Django窗體

+1

您是否仔細閱讀了文檔? http://docs.djangoproject.com/en/1.3/topics/forms/ – Nacho 2011-04-21 12:59:14

回答

9

這是一個基本的Python問題。您需要考慮執行這些命令的順序及其範圍。

首先,您定義一個名爲Test的表單類。該類有三個屬性:set_choices方法,get_choices方法和options字段。這些定義在類定義時進行評估。 options的定義調用get_choices()。但是,此時在範圍內沒有get_choices方法,因爲該類尚未定義。

即使您以某種方式設法排除了範圍問題,但這仍然無法達到您想要的效果,因爲options的選擇定義是在定義時完成的。即使您稍後致電set_choicesoptions仍然具有在定義該字段時返回的值get_choices

那麼,你究竟想要做什麼?看起來你想在options字段上設置動態選項。所以,你應該覆蓋__init__方法並在那裏定義它們。

class Test(forms.Form): 
    options = forms.ChoiceField(choices=()) 

    def __init__(self, *args, **kwargs): 
     choices = kwargs.pop('choices', None) 
     super(Test, self).__init__(*args, **kwargs) 
     if choices is not None: 
      self.fields['options'].choices = choices 
+0

那麼如何在視圖中使用測試表單時通過這些選擇? – 2016-07-27 08:42:07

+0

我不確定你在問什麼。但你當然應該問一個新問題,而不是評論一個五年的答案。 – 2016-07-27 08:56:26

0

擴展__init__是選擇動態地添加到ChoiceField爲丹尼爾羅斯曼在his answer解釋了一個好辦法。

只是添加到...在運行時添加選項是hackish(最好)。這裏是音符的最佳做法(直接從Django ChoiceField documentation) -

最後,要注意選擇可以是任何 迭代的對象 - 不一定是 列表或元組。這使您可以動態構造 選項。但是如果你發現自己的黑客選擇是 動態,你可能會更好 使用適當的數據庫表和 ForeignKey。如果有的話, 靜態數據的變化不大, 。

相關問題