我正在尝试生成一个列表来填充表单的选项。此列表将是动态的,并将取决于其他用户创建的选项。以下是该列表应派生自的模型的示例:
#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个用户声称他们在内华达山脉工作,2个用户声称他们为百威工作,5个用户声称他们为Coors工作。
我想生成一个酿酒厂列表,如下所示:
(
'Budweiser',
'Coors,
'Sierra Nevada',
)注意按字母顺序排列,没有重复的啤酒厂列表。
发布于 2017-09-03 15:10:09
在初始化表单时,需要传递额外的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()
)只需注意,要覆盖choices字段,您需要提供包含表单的值的元组和要在下拉列表中显示的文本。
发布于 2017-09-03 12:03:41
嗯,我认为你可以将“选项”设置为函数的结果。我试着这样做:
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可以在函数逻辑中设置的顺序和其他内容:)
发布于 2017-09-03 13:27:03
在表单中,您可以在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 = choiceshttps://stackoverflow.com/questions/46020023
复制相似问题