2014-03-07 112 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) 

上面的代码是未经测试