Установка выбранного значения в формах Django.ChoiceField
вот объявление поля в форме:
max_number = forms.ChoiceField(widget = forms.Select(),
choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)
Я хотел бы установить начальное значение равным 3, и это, похоже, не работает. Я играл с param, quotes / no quotes и т. д... но ничего не изменилось.
несколько результатов, которые я нашел через Google, предполагают, что можно установить начальное значение, но мне никогда не удавалось заставить его работать! Кстати, я на django 1.0.
может кто-нибудь дать мне окончательный ответ, если это возможно? И-или необходимая настройка в моем фрагменте кода?
большое спасибо.
8 ответов
попробуйте установить начальное значение при создании экземпляра формы:
form = MyForm(initial={'max_number': '3'})
это не затрагивает непосредственный вопрос под рукой, но этот Q / A подходит для поиска, связанного с попыткой присвоить выбранное значение ChoiceField
.
если вы уже назвали super().__init__
в классе формы вы должны обновить 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-кортежей. Надеюсь, это поможет.
Я столкнулся с этой проблемой, и выяснил, что проблема в браузере. При обновлении браузер повторно заполняет форму теми же значениями, что и раньше, игнорируя отмеченное поле. Если вы просмотрите Источник, вы увидите, что проверенное значение является правильным. Или поместите курсор в поле URL вашего браузера и нажмите enter. Это позволит повторно загрузить форму с нуля.
ответы Тома и Бертона в конечном итоге работают для меня, но у меня были небольшие проблемы с тем, как применить их к ModelChoiceField
.
единственный трюк в том, что варианты хранятся в виде кортежей (<model's ID>, <model's unicode repr>)
, поэтому, если вы хотите установить начальный выбор модели, вы передаете ID как начальное значение, а не сам объект или его имя или что-либо еще. Тогда все просто:
form = EmployeeForm(initial={'manager': manager_employee_id})
или initial
аргумент можно проигнорировать вместо дополнительной строки с:
form.fields['manager'].initial = manager_employee_id
Dave-есть успехи в поиске решения проблемы браузера? Есть ли способ принудительно обновить?
что касается исходной проблемы, попробуйте следующее При инициализации формы:
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')