如何创建动态Django选择字段

时间:2017-09-03 03:31:59

标签: 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()

我希望表单是这样的:

#forms.py
class BestBrewery(forms.Form):
    vote = forms.ChoiceField(choices=BREWERIES_A_USER_WORKS_FOR)

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

让我们说我有3个用户声称他们在Sierra Nevada工作,2个用户声称他们为百威工作,还有5个用户声称他们为Coors工作。

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

(
'Budweiser',
'Coors,
'Sierra Nevada',
)

请注意字母顺序,不要重复啤酒厂列表。

3 个答案:

答案 0 :(得分:1)

嗯,我认为你可以设置“选择”作为功能的结果。 我试过这样:

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())

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

choices = s._meta.get_field_by_name('yolos')[0].choices
print choices

你可以在func逻辑中设置的顺序和其他东西:)

答案 1 :(得分:1)

初始化表单时需要传递额外的1/1/70 00:00:00参数。如果您正在使用视图函数,通常会这样:

user

如果您使用的是基于类的视图,则应覆盖视图中的form = BestBrewery(request.user) 方法:

get_form_kwargs

您的表单应如下所示:

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

    return kwargs

请注意,要覆盖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() ) 字段,您需要提供包含表单值和要在下拉列表中显示的文本的元组。

答案 2 :(得分:0)

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

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