如何使用Django choicefield在动态中设置选项?

时间:2011-02-17 12:09:20

标签: python django

我想在动态中设置选择。

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

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

4 个答案:

答案 0 :(得分:17)

我经常在构造函数中动态获取选择:

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 :(得分:3)

关键是要意识到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)

或者my_choices中你喜欢的任何逻辑。

答案 2 :(得分:2)

在视图中,您可以执行以下操作

- views.py

lstChoices = _getMyChoices()

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

其中lstChoices是动态生成的元组列表供您选择。

答案 3 :(得分:0)

与maersu的解决方案类似,但是如果你有一个ModelForm,其模型对另一个模型有一个ForeignKey,你可能想要分配给该字段的查询集而不是选择。