2016-02-29 86 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