Ответ 1
Попробуйте установить начальное значение при создании формы:
form = MyForm(initial={'max_number': '3'})
Вот объявление поля в форме:
max_number = forms.ChoiceField(widget = forms.Select(),
choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)
Я хотел бы установить начальное значение равным 3
и это не похоже на работу. Я играл с параметром, кавычками/без кавычек и т.д., Но без изменений.
Может ли кто-нибудь дать мне точный ответ, если это возможно? И/или необходимые настройки в моем фрагменте кода?
Я использую Django 1.0
Попробуйте установить начальное значение при создании формы:
form = MyForm(initial={'max_number': '3'})
Это не касается непосредственного вопроса, но этот 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'
Вы также можете сделать следующее. в вашем классе класса 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-х кортежей. Надеюсь, это поможет.
Я столкнулся с этой проблемой и выяснил, что проблема в браузере. Когда вы обновляете браузер, он повторно заполняет форму теми же значениями, что и раньше, игнорируя поле checked. Если вы просмотрите источник, вы увидите, что проверенное значение верное. Или поместите курсор в поле URL вашего браузера и нажмите enter. Это перезагрузит форму с нуля.
ModelChoiceField
.
Единственный трюк в том, что выбор сохраняется в виде кортежей (<model ID>, <model unicode repr>)
, поэтому, если вы хотите установить начальный выбор модели, вы передаете модель ID в качестве начального значения, а не самого объекта или его имени или чего-либо еще. Тогда это так же просто, как:
form = EmployeeForm(initial={'manager': manager_employee_id})
В качестве альтернативы аргумент initial
можно игнорировать вместо дополнительной строки с помощью:
form.fields['manager'].initial = manager_employee_id
Дэйв - удачи найти решение проблемы с браузером? Есть ли способ принудительно обновить?
Что касается исходной проблемы, попробуйте следующее при инициализации формы:
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.base_fields['MyChoiceField'].initial = initial_value
Чтобы убедиться, что мне нужно визуализировать форму. Начальное значение используется только в несвязанной форме, если оно привязано и значение для этого поля не включено, ничего не будет выбрано.
Попробуй, это сработает для меня, я добавил это в models.py
options = (
('1','1'),
('2','2'),
('3','3')
)
max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')