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

Как я могу вернуть string значения из distinct() позвонить моей модели?

+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

Смежные вопросы