Установка выбранного значения в формах Django. ChoiceField

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

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

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

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

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

Ответ 1

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

form = MyForm(initial={'max_number': '3'})

Ответ 2

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

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

например.

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'

Ответ 3

Вы также можете сделать следующее. в вашем классе класса 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-х кортежей. Надеюсь, это поможет.

Ответ 4

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

Ответ 5

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

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

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

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

form.fields['manager'].initial = manager_employee_id

Ответ 6

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

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

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value

Ответ 7

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

Ответ 8

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

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

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')