Установка выбранного значения в формах 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')