2013-08-21 1 views
0

Я хотел бы создать раскрывающийся список Django, который имеет строку «- Select -» в качестве выбора по умолчанию. Когда пользователь нажимает на ниспадающем виджете, они будут видеть три варианта, один из которых они должны выбрать:Создайте раскрывающийся список Django с параметром «Выбрать» по умолчанию?

-- Select --   <= default choice visible 
95th percentile  <= other choices 
75th percentile  <= other choices 
50th percentile  <= other choices 

Я создал модель Django Student и связанный с ним Percentile поиск модель:

class Student(models.Model): 
    student = models.ForeignKey(User) 
    student_percentile = models.ForeignKey(Percentile) 

class Percentile(models.Model): 
    # Contains "-- Select --", "95th Percentile", etc., etc. 
    ranking = models.CharField(max_length=15) 

    def __unicode__(self): 
     return ranking 

форма Студент просто Джанго ModelForm:

from django import forms 
from app.models import Student 

class StudentForm(forms.ModelForm) 
    class Meta: 
     model = Student 
    # Custom form validator for student form will go here 

Моя идея состояла в том, что я хотел бы создать собственный валидатор в StudentForm, которая будет проверять, что пользователь выбирает процентиль ранжирования значение, чей индекс больше 1, так как строка первая в столбце рейтинга таблицы Percentile содержит строку «- Select -». Это правильный способ реализовать этот тип раскрывающегося списка в Django? Я понимаю, что я могу создать переменную RANKING_CHOICES, которая содержит ранжирование, если бы я использовал форму Django вместо ModelForm, а затем рейтинг был ChoiceField. Однако в этом случае я использую отношения с внешним ключом между Student и Percentile, поэтому я не думаю, что этот подход применим. Хотя подход, который я показал, работает, он не кажется мне очень «чистым», поскольку «Выбрать» действительно не является значением рейтинга процентиля.

Спасибо!

+0

Вы все еще можете присоединить варианты к ModelForm с CharField. И вставьте (0, ('select', 'select')) к выборам. –

+0

Абсолютно не ставьте --Выберите-- в вашей модели Percentile (см. @ Srinivas-reddy-thatiparthy для альтернативы). Возможно, вы захотите сделать второй взгляд и решить, действительно ли вам нужна модель Percentile ... также вы можете обнаружить, что если вы сохраните ее как модель, это ранжирование лучше хранится как целое/десятичное, а не символьная строка. –

+0

Спасибо Srinivas. И спасибо Джозефу. Выполнение того, что я предлагал, «плохо пахло». Рад, что вы смогли это подтвердить. – William

ответ

1

Вы можете сделать это:

class StudentForm(forms.ModelForm) 
    student_percentile = forms.ModelChoiceField(queryset= Percentile.objects.all(), empty_label="--Select--") 

    class Meta: 
     model = Student 
+0

Спасибо, karthikr. Это похоже на приятное, чистое решение, которое использует функции Django ModelForm. – William

0

Предполагая, что список процентиль выбор не меняется часто, этот блог дает хороший способ делать то, что вы обсуждаете.

http://www.b-list.org/weblog/2007/nov/02/handle-choices-right-way/

Он описывает использование кортежа выбора и подачи его к CharField (или, возможно, за комментарий Джозефа Paetz в выше, вы могли бы использовать IntegerField для более эффективной сортировки и агрегации, и поэтому вы не хранение что действительно числовое значение как текст).

С вашим конкретным случаем вы можете просто добавить опцию '--Select--' в качестве первой опции, возможно, со значением '-1' или чем-то аналогичным, чтобы вы могли подтвердить это значение, когда форма . Если это -1, они ничего не выбрали.

PERCENTILE_CHOICES = (
    (-1, '--Select--'), 
    (95, '95th Percentile'), 
    (80, '80th Percentile'), 
...etc... 
) 
+0

Спасибо, что обратились к этой статье. Я предпочитаю решение Karthikr в этом случае, но я могу видеть, как я использую эту статью позже. – William

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