这是表单中的字段声明:
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
相关的搜索。
如果您已经在 Form 类中调用了 super().__init__
,则应该更新 form.initial
字典,而不是 field.initial
属性。如果您研究 form.initial
(例如,在调用 super().__init__
之后的 print self.initial
),它将包含 所有 字段的值。在该字典中具有 None
值将覆盖 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'
您还可以执行以下操作。在您的表单类定义中:
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 元组列表。希望这可以帮助。
initial
的值是指要选择的项目的键,而不是它的索引。花了我几次尝试来解决这个问题!
我也遇到了这个问题,发现问题出在浏览器上。当您刷新浏览器时,会使用与以前相同的值重新填充表单,而忽略选中的字段。如果您查看源代码,您会看到选中的值是正确的。或者将光标放在浏览器的 URL 字段中,然后按 Enter。这将从头开始重新加载表单。
Tom 和 Burton 的答案最终都对我有用,但我在弄清楚如何将它们应用于 ModelChoiceField
时遇到了一些麻烦。
唯一的技巧是选择存储为 (<model's ID>, <model's unicode repr>)
的元组,因此如果要设置初始模型选择,请将模型的 ID 作为初始值传递,而不是对象本身或者它的名字或其他任何东西。然后它很简单:
form = EmployeeForm(initial={'manager': manager_employee_id})
或者,可以忽略 initial
参数来代替额外的一行:
form.fields['manager'].initial = manager_employee_id
GET
请求后设置表单的初始值并从视图中设置的少数情况下完美运行。
ModelChoiceField
使其工作的唯一方法(遗憾的是,Django 2.1。也许在较新的版本中效果更好)。
戴夫 - 找到解决浏览器问题的方法有什么运气吗?有没有办法强制刷新?
至于原来的问题,在初始化表单的时候尝试如下:
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.base_fields['MyChoiceField'].initial = initial_value
Instances should always modify self.fields; they should not modify self.base_fields.
可以肯定的是,我需要看看您是如何呈现表单的。初始值仅用于未绑定的表单,如果已绑定且未包含该字段的值,则不会选择任何内容。
不定期副业成功案例分享
'3'
对应于元组的第一个值还是第二个?