如何创建动态 Django 选择字段

L.h*_*wes 2 python django list

我正在尝试生成一个列表来填充表单的选项。此列表将是动态的,并取决于其他用户创建的选项。以下是列表应源自的模型示例:

#models.py
class User(models.Model):
    brewery_you_work_for = models.CharField(choises=ALL_THE_BREWERIES_IN_THE_WORLD)
    username = models.CharField()
Run Code Online (Sandbox Code Playgroud)

我希望表格是这样的:

#forms.py
class BestBrewery(forms.Form):
    vote = forms.ChoiceField(choices=BREWERIES_A_USER_WORKS_FOR)
Run Code Online (Sandbox Code Playgroud)

我想要做的是列出世界上所有啤酒厂的列表,供某些用户选择作为他们工作的啤酒厂。然后我想生成一个列表供其他用户投票为最佳啤酒厂。

假设我有 3 个用户声称他们在内华达山脉工作,2 个用户声称他们为百威啤酒工作,5 个用户声称他们为 Coors 工作。

我想生成一个如下所示的啤酒厂列表:

(
'Budweiser',
'Coors,
'Sierra Nevada',
)
Run Code Online (Sandbox Code Playgroud)

请注意按字母顺序排列,并且没有重复的啤酒厂列表。

dav*_*uto 5

user初始化表单时,您需要传递一个额外的参数。如果您使用视图函数,通常是这样的:

form = BestBrewery(request.user)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是基于类的视图,您应该覆盖get_form_kwargs视图中的方法:

def get_form_kwargs(self):
    kwargs = super(MyView, self).get_form_kwargs()
    kwargs['user'] = self.request.user

    return kwargs
Run Code Online (Sandbox Code Playgroud)

您的表单应如下所示:

class BestBrewery(forms.Form):

    def __init__(self, user, *args, **kwargs):
        super(BestBrewery, self).__init__(*args, **kwargs)

        self.fields['vote'].choices = (
            user.brewery_you_work_for,
            user.get_brewery_you_work_for_display()
        )
Run Code Online (Sandbox Code Playgroud)

请注意,要覆盖该choices字段,您需要提供包含表单值和要在下拉列表中显示的文本的元组。