2016-02-29 56 views
4

我想要做的是在模型表中的一列中填充一个select元素,其中包含不同的值。具有不同列值的django modelchoicefield

我forms.py:

class ExampleForm(forms.ModelForm): 
    only_unique_values = forms.ModelChoiceField(
     required = False, 
     queryset = ReadOnlyTable.objects.values('pie').distinct(), 
     widget = forms.Select 
    ) 

使用values函数返回ValuesQuerySet,而不是QuerySet,这是一个问题,我select元素,因为所有的选项都与词典语法而不是值填充只有列数据为string s。

它结束了看起来像这样

<select id="id_example" name="example_form"> 
<option value="" selected="selected">---------</option> 
<option value="{'pie': u'apple  '}">{'pie': u'apple  '}</option> 
<option value="{'pie': u'pecan  '}">{'pie': u'pecan  '}</option> 
<option value="{'pie': u'dutch  '}">{'pie': u'dutch  '}</option> 
<option value="{'pie': u'pumpkin  '}">{'pie': u'pumpkin  '}</option> 
</select> 

我多么希望它看起来是像这样

<select id="id_example" name="example_form"> 
<option value="" selected="selected">---------</option> 
<option value="apple">apple</option> 
<option value="pecan">pecan</option> 
<option value="dutch">dutch</option> 
<option value="pumpkin">pumpkin</option> 
</select> 

如何从一个distinct()返回string值打电话给我的模特?

+0

你使用PostgreSQL?如果是这样,你总是可以做... objects.all()。distinct('pie') –

+0

@ Obj3ctiv3_C_88不,SQL Server。 – smilebomb

回答

2

模型选择字段用于从模型中选择实例。如果您从模型实例中选择值,那么模型选择字段不再适用。

您可以改为使用选择字段,并在表单的__init__方法中设置选项。

class ExampleForm(forms.ModelForm): 
    only_unique_values = forms.ChoiceField(
     required=False, 
     choices=[], 
     widget=forms.Select, 
    ) 

    def __init__(self, *args, **kwargs): 
     super(ExampleForm, self).__init__(*args, **kwargs) 
     self.fields['only_unique_values'].choices = ReadOnlyTable.objects.values_list('pie', 'pie').distinct() 

在做values_list('pie', 'pie')给你的选择字段所需的二元组列表。

在Django 1.8+中,您不需要重写__init__。相反,您可以定义可返回选项列表的可调用对象,并将可调用对象传递给您的选择字段。

def unique_values(): 
    return ReadOnlyTable.objects.values_list('pie', 'pie').distinct() 

class ExampleForm(forms.ModelForm): 
    only_unique_values = forms.ChoiceField(
     required=False, 
     choices=unique_values, 
     widget=forms.Select, 
    ) 

为了在你的选择领域的空白选项,只需添加一个项目的选项列表:

def unique_values(): 
    return [("", "---------")] + list(ReadOnlyTable.objects.values_list('pie', 'pie').distinct()) 
+0

你的意思是在这里有'ChoiceField'吗? – smilebomb

+0

是的,它应该是一个选择领域。现在修复。 – Alasdair

+0

这是否杀死默认值选项? – smilebomb