在Django中使用动态选择字段

9

我有一个 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,而我的_actual_choices似乎无法工作。

我认为第三种解决方法是创建ChoiceField的子类并重新定义save(),但我不确定如何着手做到这一点。

1个回答

9

您可以通过重写 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) 等。


提示:该段文字涉及 IT 技术。

当我看到构造函数前面的 super() 时,我感到很困惑,但是当我尝试使用它时,我得到了一个错误:name 'self' is not defined。super() 必须在构造函数中。通过查看编辑历史记录,我认为这就是 Surya 的意思,因为 super() 最初是构造函数中的最后一行。 - user2233706
可选的,但如果您假设“choices”是一个关键字参数,代码可能会更漂亮 - 如:http://blog.eliacontini.info/post/41598616573/django-set-select-choices-dynamically-in-forms - ecoe
这对我有效,但为什么我应该在表单的init中定义表单字段,而不是在表单类下搜索选择值? - user856358
1
如果您的choicefield已经存在,您可以像这样添加选项:self.fields['choices'].choices = [(x.pk, x.get_full_name()) for x in User.objects.all()] - surfeurX

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