2013-04-17 7 views
1

У меня есть класс ModelForm, в котором я установил пару полей как ChoiceField. Для одного из моих взглядов, я хотел бы создать форму из моего ModelForm класса, который вытягивает из экземпляра моей модели в базе данных (например, так):Django ModelForm ChoiceField не отображает данные экземпляра

form = MyModel(instance=model_instance) 

Когда я делаю это, и затем сделать форму в шаблоне я заметил, что большинство полей предварительно заполнены значениями, вытащенными из экземпляра модели, и это то, что я хочу. Однако это не относится к двум полям ChoiceField. Эти рендеринги отображаются в виде выпадающих меню выбора без какой-либо определенной опции.

Что странно, если я не определяю эти два поля как ChoiceField -type в моем классе ModelForm, они отображают как обычные текстовые поля ввода в HTML и предварительно заполняют их с использованием значений базы данных. Но когда я определяю их так, чтобы они отображались как поля ввода выбора в HTML, ничего не было выбрано заранее. Могу ли я изменить это так, чтобы значения из базы данных были предварительно выбраны?

EDIT: В соответствии с просьбой вот код для моей модели и формы:

class App(models.Model): 
    CODES = (
     (u'a',u'annual'), 
     (u'm',u'monthly'), 
     (u'w',u'weekly') 
    ) 
    code = models.CharField(max_length=1, choices=CODES) 
    start_time = models.TimeField(blank=True, null=True) 
    end_time = models.TimeField(blank=True, null=True) 


class AppForm(ModelForm): 
    CODES = (
     (u'',u'Please select code'), 
     (u'a',u'annual'), 
     (u'm',u'monthly'), 
     (u'w',u'weekly') 
    ) 
    TIMES = (
     (u'00:00',u'All Day'), 
     (u'12:00',u'Noon') 
    ) 
    start_time = forms.ChoiceField(required=False, choices=TIMES) 
    end_time = forms.ChoiceField(required=False, choices=TIMES) 
    code = forms.ChoiceField(choices=CODES, label='Type') 

    class Meta: 
     model = App 

Интересно, что code поля имеет значение экземпляра модели заранее выбранное просто отлично, когда визуализируются как HTML. Интересно, имеет ли смысл аргумент choices в определении модели?

UPDATE: Я просто заметил, что если я подтянуть App экземпляр в python manage.py shell так:

a = App.objects.get(id=16) 
a.start_time 

я получаю значение как datetime.time(12, 0). Но в администраторе Django, когда я просматриваю все экземпляры App, все они показывают (None) под start_time и end_time. Почему это так?

+0

возможно дубликат [Как сделать пункт меню Джанго ModelForm выбран по умолчанию?] (Http://stackoverflow.com/questions/624265/how-do-i-make-a-django -modelform-menu-item-selected-by-default) и многие другие. –

+0

Вы могли бы разместить код в своей модели и форме. Благодарю. – Amyth

+0

@Hedde, не желая иметь выбранную по умолчанию опцию. Я хочу, чтобы выбранная опция появилась из экземпляра объекта. Вы заметите, что я действительно опубликовал комментарий ниже принятого ответа на этот другой вопрос именно потому, что он не сработал для меня. – GChorn

ответ

1

В ответ на ваше обновление: ваши строки времени соответствуют строке времени по умолчанию HH: формат ММ. Так же, как пользователь вводит их с веб-сайта вручную 12:00. Значения анализируются и превращаются во время сохранения модели (при правильной проверке).

И когда вы загружаете модель, то, конечно, начальные значения, загруженные из объекта, соответствуют типу поля (models.TimeField).

Если заменить РАЗ с

(datetime.time(0,0),u'All Day'), 
    (datetime.time(12,0),u'Noon') 

ваши проблемы должны быть старше.

Алан

+0

Привет, Алан, спасибо за ответ, я действительно пришел к тому же самому выводу прямо перед тем, как увидел ваш ответ (я действительно вернулся, чтобы «ответить» на мой собственный вопрос!). Интересно, что одна вещь, которую я обнаружил, когда я возился с проблемой, заключается в том, что если вы создаете набор 'CHOICES' в определении модели, который использует строковые представления раз, он выдает ошибку при попытке сохранить одно из этих значений в форме (это не было сделано, когда в определении 'AppForm' было указано« ВЫБОРЫ », как указано выше). Но самое странное, что он не выдавал ошибку при попытке сохранить '' 00: 00'', только '12: 00'. – GChorn

+0

Если вы предоставляете варианты в форме, то вы, вероятно, должны использовать forms.TypedChoiceField с аргументом 'coerce', установленным в datetime.time https://docs.djangoproject.com/en/dev/ref/forms/fields/#typedchoicefield. И это должно исправить эту ошибку. –