Установка выбранного значения в формах Django. ChoiceField - PullRequest
102 голосов
/ 18 марта 2009

Вот объявление поля в форме:

max_number = forms.ChoiceField(widget = forms.Select(), 
    choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

Я хотел бы установить начальное значение равным 3, и это, похоже, не работает. Я играл с параметром, кавычками / без кавычек и т. Д., Но без изменений.

Может ли кто-нибудь дать мне окончательный ответ, если это возможно? И / или необходимые настройки в моем фрагменте кода?

Я использую Django 1.0

Ответы [ 8 ]

106 голосов
/ 20 марта 2009

Попробуйте установить начальное значение при создании экземпляра формы:

form = MyForm(initial={'max_number': '3'})
80 голосов
/ 09 июля 2012

Это не касается непосредственного вопроса под рукой, но этот Q / A подходит для поиска, связанного с попыткой присвоить выбранное значение ChoiceField.

Если вы уже вызвали super().__init__ в своем классе Form, вам следует обновить словарь form.initial, а не свойство field.initial. Если вы изучите form.initial (например, print self.initial после вызова super().__init__), он будет содержать значения для всех полей. Значение None в этом диктанте переопределит значение field.initial.

, например * * 1016

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        # assign a (computed, I assume) default value to the choice field
        self.initial['choices_field_name'] = 'default value'
        # you should NOT do this:
        self.fields['choices_field_name'].initial = 'default value'
39 голосов
/ 02 июля 2010

Вы также можете сделать следующее. в вашей форме класс def:

max_number = forms.ChoiceField(widget = forms.Select(), 
                 choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

тогда при вызове формы в вашем представлении вы можете динамически устанавливать как начальный выбор, так и список выбора.

yourFormInstance = YourFormClass()

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)]
yourFormInstance.fields['max_number'].initial = [1]

Примечание: начальные значения должны быть списком, а выбор должен быть 2-кортежем, в моем примере выше у меня есть список из 2-кортежей. Надеюсь, это поможет.

18 голосов
/ 02 декабря 2009

Я тоже столкнулся с этой проблемой и выяснил, что проблема в браузере. При обновлении браузер повторно заполняет форму теми же значениями, что и раньше, игнорируя отмеченное поле. Если вы посмотрите на источник, вы увидите, что проверенное значение верное. Или поместите курсор в поле URL вашего браузера и нажмите Enter. Это перезагрузит форму с нуля.

6 голосов
/ 27 февраля 2011

В конечном итоге ответы Тома и Бертона работают на меня, но у меня возникла небольшая проблема с выяснением, как применить их к ModelChoiceField.

Единственная хитрость заключается в том, что выборы сохраняются в виде кортежей (<model's ID>, <model's unicode repr>), поэтому, если вы хотите установить начальный выбор модели, вы передаете ID модели в качестве начального значения, а не сам объект или его имя или что-то еще. Тогда это так просто, как:

form = EmployeeForm(initial={'manager': manager_employee_id})

В качестве альтернативы аргумент initial можно игнорировать вместо дополнительной строки с помощью:

form.fields['manager'].initial = manager_employee_id
3 голосов
/ 14 января 2010

Дэйв - удача в поиске решения проблемы с браузером? Есть ли способ принудительного обновления?

Что касается исходной проблемы, попробуйте следующее при инициализации формы:

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value
1 голос
/ 18 марта 2009

Чтобы быть уверенным, мне нужно посмотреть, как вы отрисовываете форму. Начальное значение используется только в несвязанной форме, если оно связано и значение для этого поля не включено, ничего не будет выбрано.

0 голосов
/ 24 апреля 2015

Попробуйте, это работает у меня, я добавил это в models.py

options = (
    ('1','1'),
    ('2','2'),
    ('3','3')
)

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...