2011-02-17 25 views
7

我想设置动态选择。如何用Django choicefield设置动态选项?

我用__set_choices方法,但是当请求方法是POST时, is_valid方法总是返回False。

class MyForm(BaseForm): 
    afield = forms.ChoiceField(choices=INITIAL_CHOICES) 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['afield'].choices = my_computed_choices 
+1

什么是“__set_choices方法”?它有什么作用?什么叫它?你的表格是什么? – 2011-02-17 12:33:50

回答

15

我经常在构造函数中设置的选择动态地分配给字段的查询集而不是选择。

+1

谢谢,尼斯解决方案,也很容易实现。 – shahjapan 2014-01-23 10:20:24

0

到maersu的解决方案类似,但如果你有有一个ForeignKey到另一个模型模型的ModelForm,你可能想:

 
if request.method=='POST': 
_form = MyForm(request.POST) 
if _form.is_valid(): 
    #something to do 
3

的关键是要认识到choices可以是任何可迭代的:你的内心my_choices喜欢

import uuid 
from itertools import count 
class MyForm(BaseForm): 

    counter = count(1) 

    @staticmethod 
    def my_choices(): 
     yield (uuid.uuid1, next(counter)) 

    afield = forms.ChoiceField(choices=my_choices) 

或者任何逻辑。

1

在你可以做以下

--views.py

lstChoices = _getMyChoices() 

form.fields['myChoiceField'].choices = lstChoices 

其中lstChoices一个视图是您的选择动态生成的元组的列表。

+0

是的,但表单验证仍然失败。 (django 1.8) – FizxMike 2016-01-25 02:17:13

相关问题