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

108

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

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

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

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

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

большая жизнь
источник
Мне было интересно то же самое. "initial" также не подходит для работы с вариантами в последней основной версии.
Тай.

Ответы:

115

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

form = MyForm(initial={'max_number': '3'})
Том
источник
3
Является ли '3'соответствующий первому значению кортежа или второй?
Bestasttung,
5
кортежи представляют пары (значение, метка) для параметров, и вы хотите указать начальное значение, поэтому «3» относится к первому элементу.
Том
95

Это не касается непосредственного вопроса, но этот вопрос / ответ подходит для поисков, связанных с попыткой присвоить выбранное значение параметру 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
если вы не понимаете этот ответ, прочтите эти ошибки в форме django
ChillarAnand
1
Я не уверен, что это потому, что этот ответ настолько старый, что он больше не работает, но я не могу заставить это решение работать. Я перепробовал каждую комбинацию из вышеперечисленного, но все равно не получил любви Я снова задал этот вопрос здесь: stackoverflow.com/questions/52191096/… Если ответ все тот же, дайте мне знать, что не так с моим кодом. Спасибо!
Lehrian 05
49

Вы также можете сделать следующее. в вашем классе формы 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]

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

Бертон Уильямс
источник
5
Возможно, стоит отметить, что значение initialотносится к ключу выбираемого элемента, а не к его индексу. Мне потребовалось несколько попыток, чтобы решить эту проблему!
BigglesZX
20

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

Дэйв
источник
1
просто fyi, это все еще происходит в FF6. Одного нажатия кнопки обновления недостаточно. Но в Google Chrome кнопки обновления достаточно, не нужно переходить в адресную строку
mhd
1
Я думаю, что это всегда будет происходить в Firefox; это предполагаемое поведение.
thepeer
Еще случается в Chrome 83, ты спас мне жизнь мужик!
Lapin
7

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

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

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

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

form.fields['manager'].initial = manager_employee_id
Орлада
источник
1
Вторая строка кода работает безупречно в одном из тех редких случаев, когда вам нужно установить начальное значение формы после GETзапроса и установить его из представления.
kstratis
3

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

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

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

источник
1
Это выглядит не очень красиво. Цитата из django 1.3, forms.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek
1

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

Эндрю Уилкинсон
источник
-4

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

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

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')
Abhijeetmote
источник
6
Это дает ошибку в django 1.8.1: TypeError at /my/url/ __init__() got an unexpected keyword argument 'default' Request Method: GET Request URL: http://localhost:8000/my/url/ Django Version: 1.8.1 Exception Type: TypeError Exception Value: __init__() got an unexpected keyword argument 'default'
juliocesar