设置 Django 窗体上的选定值

下面是表单中的字段声明:

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

I would like to set the initial value to be 3 and this doesn't seem to work. I have played about with the param, quotes/no quotes, etc... but no change.

如果可能的话,有人能给我一个明确的答案吗? 或者在我的代码片段中进行必要的调整?

我正在使用姜戈1.0

177603 次浏览

为了确保我需要看到你是如何渲染的形式。初始值仅在未绑定的形式中使用,如果它是绑定的,并且该字段的值不包括在内,则不会选择任何内容。

尝试在实例化表单时设置初始值:

form = MyForm(initial={'max_number': '3'})

我也遇到了这个问题,发现问题出在浏览器上。刷新时,浏览器将使用与前面相同的值重新填充表单,忽略选中的字段。如果您查看源代码,您将看到检查的值是正确的。或者将光标放在浏览器的 URL 字段中,然后按回车键。将从头重新加载表单。

Dave-有没有找到解决浏览器问题的方法? 有没有强制刷新的方法?

对于原始问题,在初始化表单时请尝试以下操作:

def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.base_fields['MyChoiceField'].initial = initial_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-元组的列表。希望这个能帮上忙。

汤姆和伯顿的答案最终都对我有用,但是我在如何将它们应用到 ModelChoiceField上遇到了一点困难。

The only trick to it is that the choices are stored as tuples of (<model's ID>, <model's unicode repr>), so if you want to set the initial model selection, you pass the model's 身份证 as the initial value, not the object itself or it's name or anything else. Then it's as simple as:

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

或者,可以忽略 initial参数,以代替带有以下内容的额外行:

form.fields['manager'].initial = manager_employee_id

这并没有触及手头的直接问题,但是这个问答出现在与试图将所选值赋给 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'