在Django中使用动态选择字段

时间:2012-07-21 00:09:38

标签: django dynamic choicefield

我有choiceField以创建带有一些选项的选择字段。像这样:

forms.py
    class NewForm(forms.Form):
        title = forms.CharField(max_length=69)
        parent = forms.ChoiceField(choices = CHOICE)

但我希望能够在没有预定义元组的情况下创建选项(ChoiceField需要)。基本上,我需要访问request.user来根据每个用户填写一些选项标签,但我不知道是否有任何方法可以在forms.Form类中使用请求。

另一种方法是通过以下方式预填充NewForm的实例:

views.py
form = NewForm(initial={'choices': my_actual_choices})

但是我必须添加一个虚拟的CHOICE来创建NewForm,而my_actual_choices似乎无论如何都不起作用。

我认为解决这个问题的第三种方法是创建ChoiceField的子类并重新定义save(),但我不知道该怎么做。

1 个答案:

答案 0 :(得分:7)

您可以通过覆盖 init 动态填充它们,基本上代码如下:

class NewForm(forms.Form):
    def __init__(self, choices, *args, **kwargs):
        super(NewForm, self).__init__(*args, **kwargs)
        self.fields["choices"] = forms.ChoiceField(choices=choices)

NewForm(my_actual_choices)NewForm(my_actual_choices, request.POST, request.FILES)等。