我试图使用一个ChoiceField与Django Forms建立一个下拉字段的类别选择,应该动态更新,每当一个类别被添加。对于动态更新,我使用init表单的功能:
class CreateForm(forms.Form):
title=forms.CharField(xxx)
description = forms.CharField(xxx)
URL = forms.CharField(xxx)
starting_price = forms.IntegerField(xxx)
def __init__(self, *args, **kwargs):
super(CreateForm, self).__init__(*args, **kwargs)
self.fields['category'] = forms.ChoiceField(choices=[value['category'] for value in Category.objects.all().values('category')])
Category对象是一个只有一个条目的模型,即category = models.CharField()
。现在,在Django文档中,它提到choices
的任何可迭代对象都可以工作。所以在理论上,一个列表应该工作(上面给了我一个像['furniture', 'appliances', 'cars']
这样的列表)。
然而,我得到了一个ValueError: too many values to unpack (expected 2)
。
我也试图在list()
语句中包装列表,结果相同。尝试像([value['category'] for value in Category.objects.all().values('category')],)
这样的元组,这应该没有意义,给出相同的结果。
于是,经过一番折腾找到了答案。我必须传递一个由主键(id)的值和类别组成的元组列表,如下所示:
[(value['id'],value['category']) for value in Category.objects.all().values()]