簡體   English   中英

具有不同列值的django modelchoicefield

[英]django modelchoicefield with distinct column values

我想要做的是從模型表中的一列填充具有不同值的select元素。

我的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值?

模型選擇字段用於從模型中選擇實例。 如果要從模型實例中選擇值,則模型選擇字段不再適用。

您可以使用選擇字段,並在表單的__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') choice字段所需的兩元組列表。

在Django 1.8+中,您不再需要覆蓋__init__ 相反,您可以定義一個返回選項列表的callable,並將callable傳遞給您的choice字段。

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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM