我使用ModelChoiceField创建了表单并从数据库模型中加载了值。 我使用下面的代码创建表单
class MetamodForm(forms.Form):
metamodule_name = forms.ModelChoiceField(queryset=Metamodule.objects.all().values("name").distinct(),empty_label='Pick a Meta module')
但我的输出格式为
{'name': u'CCD infra'}
{'name': u'dependf'}
{'name': u'BAR weste'}
我不知道为什么我得到上面的输出。请给我一个解决方案。
答案 0 :(得分:0)
在此示例中,由于您使用.all(),因此您不应该使用distinct。
https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.values
值返回QuerySet之外的其他内容(一个ValuesQuerySet),这就是为什么你没有得到你想要的格式。
解决方案是不要在查询集上使用.values和.distinct调用。
替换
forms.ModelChoiceField(
queryset=Metamodule.objects.all().values("name").distinct(),
empty_label='Pick a Meta module')
使用
forms.ModelChoiceField(
queryset=Metamodule.objects.all(),
empty_label='Pick a Meta module')
我猜你正在尝试让模型形式显示“' name'字段作为选择。您可以编写Metamodule的unicode方法来影响它在表单上的显示方式,也可以使用ModelChoiceField的label_from_instance。
https://docs.djangoproject.com/en/1.6/ref/forms/fields/#django.forms.ModelChoiceField
答案 1 :(得分:0)
仅在PostgreSQL上,您可以传递位置参数(* fields)以指定DISTINCT应应用的字段的名称。
因此,如果你正在使用PostgreSQL,你可以这样做:
Metamodule.objects.distinct('name)
如果没有,这是一个可能的kludge。我确定有人会用同样的东西更新这个。
metamodules = Metamodule.objects.all()
metamodule_name_list = []
metamodule_id_list = []
for metamodule in metamodules:
if metamodule.name not in metamodule_name_list:
metamodule_name_list.append(metamodule.name)
metamodule_id_list.append(metamodule.id)
distinct_metamodules_by_name = Metamodule.objects.filter(id__in=metamodule_id_list)
forms.ModelChoiceField(
queryset=distinct_metamodules_by_name,
empty_label='Pick a Meta module')
我不知道你为什么这样做,但请注意,虽然你会得到一个独特的名字"在你的下拉列表中, 在视图中处理时,您可能无法获得您实际需要的ID /对象。