我正在尝试生成一个列表来填充表单的选项。此列表将是动态的,并取决于其他用户创建的选项。以下是列表应该派生的模型示例:
#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',
)
请注意字母顺序,不要重复啤酒厂列表。
答案 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