2014-03-07 117 views
6

我正在嘗試爲ChoiceField創建一個動態的選項列表,但我似乎無法調用請求。下面的代碼:Django +表單:ChoiceField的動態選擇

的錯誤:

AttributeError: 'CreationForm' object has no attribute 'request' 

形式

class FooForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     super(FooForm, self).__init__(*args, **kwargs) 
     bars = self.request.session['bars'] 
     foo_list = [] 
     for bar in bars: 
      foo_list.append((bar['id'], bar['name']),) 
     self.fields['foo'].choices = foo_list 
    foo = forms.ChoiceField(choices=foo_list, required=True) 

回答

16

爲什麼不從視圖中通過選擇在當實例的形式?

例如

形式:

class FooForm(forms.Form): 
    def __init__(self, foo_choices, *args, **kwargs): 
     super(FooForm, self).__init__(*args, **kwargs) 
     self.fields['foo'].choices = foo_choices 

    foo = forms.ChoiceField(choices=(), required=True) 

查看:

... 
bars = request.session['bars'] 
foo_list = [] 
for bar in bars: 
    foo_list.append((bar['id'], bar['name']),) 
form = FooForm(foo_list) 
... 
+0

感謝您的回答。我想避免分離這兩個操作,但似乎沒有其他方式... – user1909186

+0

方法的問題是,當您在另一個視圖中調用表單實例上的is_valid()時,沒有選擇傳遞,因此is_valid ()總是返回False – samix73

+0

我們怎樣才能重用FormView這個特殊的窗體?通常,FormView在實例化Form時不接受參數...我是否必須編寫FormView的自定義特化? –

0

爲了得到處理的驗證上is_valid()行動,我認爲這會工作

class FooForm(forms.Form): 
    def __init__(self, foo_choices, *args, **kwargs): 
     self.base_fields['foo'].choices = foo_choices 
     super(FooForm, self).__init__(*args, **kwargs) 

    foo = forms.ChoiceField(choices=(), required=True) 

上面的代碼是未經測試