如何在Django的ChoiceField中动态设置选项?

10

我希望能够动态设置选项。

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

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

1
“__set_choices方法”是什么?它是做什么的?谁调用它?你的表单是什么? - Daniel Roseman
5个回答

24

我经常在构造函数中动态设置选项:

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
谢谢,好的解决方案,也很容易实现。 - shahjapan

4

关键在于意识到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
在视图中,您可以执行以下操作:
-- views.py
lstChoices = _getMyChoices()

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

其中lstChoices是动态生成的元组列表,用于你的选择。


是的,但表单验证仍然失败。(django 1.8) - FizxMike

0
使用构造函数设置动态选项,如下所示:
class DateForm(forms.ModelForm):    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # Write the code here to set dynamic choices

        self.fields['month'].choices = dynamic_choices

此外,我建议在动态选择中添加空标签('',"---------"),以便动态选择正常工作,就像Django中选择框的默认行为一样。

-1

与maersu的解决方案类似,但如果您有一个包含对另一个模型的ForeignKey的模型的ModelForm,则可能希望将其分配给字段的查询集而不是选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接