首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建动态Django选择字段

如何创建动态Django选择字段
EN

Stack Overflow用户
提问于 2017-09-03 11:31:59
回答 3查看 4.5K关注 0票数 2

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

代码语言:javascript
复制
#models.py
class User(models.Model):
    brewery_you_work_for = models.CharField(choises=ALL_THE_BREWERIES_IN_THE_WORLD)
    username = models.CharField()

我希望表单是这样的:

代码语言:javascript
复制
#forms.py
class BestBrewery(forms.Form):
    vote = forms.ChoiceField(choices=BREWERIES_A_USER_WORKS_FOR)

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

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

我想生成一个酿酒厂列表,如下所示:

代码语言:javascript
复制
(
'Budweiser',
'Coors,
'Sierra Nevada',
)

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

EN

回答 3

Stack Overflow用户

发布于 2017-09-03 15:10:09

在初始化表单时,需要传递额外的user参数。如果您使用视图函数,通常如下所示:

代码语言:javascript
复制
form = BestBrewery(request.user)

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

代码语言:javascript
复制
def get_form_kwargs(self):
    kwargs = super(MyView, self).get_form_kwargs()
    kwargs['user'] = self.request.user

    return kwargs

您的表单应如下所示:

代码语言:javascript
复制
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()
        )

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

票数 5
EN

Stack Overflow用户

发布于 2017-09-03 12:03:41

嗯,我认为你可以将“选项”设置为函数的结果。我试着这样做:

代码语言:javascript
复制
def yolo():
    # there we will get stats from db and return choices depends on stats
    first_query = 1  # there U will use more complicated logic :)
    second_query = 3
    if first_query > second_query:
        return (1, 2, 3)
    else:
        return (1, 3)

class Event(models.Model):
    date = models.DateField(primary_key=True)
    count_of_updates = models.SmallIntegerField(default=0)
    yolos = models.CharField(max_length=255, choices=yolo())

而且,为了确保你可以用丑陋的东西检查你的选择:

代码语言:javascript
复制
choices = s._meta.get_field_by_name('yolos')[0].choices
print choices

可以在函数逻辑中设置的顺序和其他内容:)

票数 4
EN

Stack Overflow用户

发布于 2017-09-03 13:27:03

在表单中,您可以在init中更改字段的选择。

代码语言:javascript
复制
class BestBrewery(forms.Form):
    vote = forms.ChoiceField()

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

        # get the choices from where you need
        choices = (...)
        self.fields['vote'].choices = choices
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46020023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档