【问题标题】:Using dynamic Choice Field in Django在 Django 中使用动态选择字段
【发布时间】:2012-07-21 00:09:38
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: django dynamic choicefield


    【解决方案1】:

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

    【讨论】:

    • 在构造函数前看到super()的时候一头雾水,但是一试就报错:name 'self' is not defined。 super() 必须在构造函数中。查看编辑历史,我认为这就是 Surya 的意思,因为 super() 最初是构造函数中的最后一行。
    • 可选,但如果您只是将“选择”假设为一个 kwarg,代码可能会更漂亮 - 如:blog.eliacontini.info/post/41598616573/…
    • 这对我有用,但是为什么我要在表单的 init 中定义表单的字段,而不是在表单类下搜索选择值?
    • @user856358 如果您的选择字段已经存在,您可以添加您的选择,例如:self.fields['choices'].choices = [(x.pk, x.get_full_name())对于 User.objects.all() 中的 x]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2011-08-25
    • 1970-01-01
    • 2018-07-16
    • 2023-03-06
    • 2015-03-12
    相关资源
    最近更新 更多