Django modelchoicefield with different column values

What I would like to do is populate an element with selectdifferent values ​​from a single column in the model table.

my forms.py:

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

Using a function valuesreturns ValuesQuerySetinstead QuerySet, which is a problem for my element select, because all parameters are populated with dictionary syntax as values, and not just column data like strings.

It looks like this ::

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

How I would like it to look like this ::

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

How do I return values stringfrom a call distinct()in my model?

+4
source share
1 answer

- . , .

__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())
+2

All Articles