以下是表单中的字段声明:
max_number = forms.ChoiceField(widget = forms.Select(),
choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)
我想将初始值设置为3
,这似乎不起作用。我玩过param,引用/没有引号等...但没有变化。
如果可能,有人能给我一个明确的答案吗?和/或我的代码片段中的必要调整?
我正在使用Django 1.0
在实例化表单时尝试设置初始值:
form = MyForm(initial={'max_number': '3'})
这并不涉及眼前的问题,但是这个Q / A出现在与尝试将所选值分配给ChoiceField
相关的搜索中。
如果您已在Form类中调用super().__init__
,则应更新form.initial
字典,而不是field.initial
属性。如果你研究form.initial
(例如在调用print self.initial
之后的super().__init__
),它将包含所有字段的值。在该字典中具有None
的值将覆盖field.initial
值。
EG
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
戴夫 - 任何运气找到浏览器问题的解决方案?有没有办法强制刷新?
至于原始问题,请在初始化表单时尝试以下操作:
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')