在Django表单上设置所选值


106

这是形式的字段声明:

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

我想将初始值设置为3,这似乎不起作用。我玩过参数,引号/无引号等,但是没有变化。

如果有可能,谁能给我一个明确的答案?和/或对我的代码段进行必要的调整?

我正在使用Django 1.0


我一直在想同样的事情。“ initial”也不能与最新的主干版本中的选项一起使用。
Ty。

Answers:


114

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

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

3
'3'对应于元组的第一个值还是第二个?
Bestasttung

4
元组表示选项的(值,标签)对,并且您要指定初始值-因此“ 3”表示第一项。
汤姆(Tom)

95

这并不涉及眼前的紧迫问题,但此问题会针对与尝试将选定值分配给相关的搜索出现ChoiceField

如果您已经super().__init__在Form类中调用过,则应该更新form.initial字典,而不是field.initial属性。如果您学习form.initial(例如print self.initial,在调用后super().__init__),它将包含所有字段的值。具有值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'

3
如果您不明白这个答案,请阅读django表格
ChillarAnand 2015年

1
我不确定是否是因为此答案太旧而无法使用,但是我无法使该解决方案起作用。我已经尝试了上述所有组合,但仍然没有得到爱。我在这里再次问了这个问题:stackoverflow.com/questions/52191096/… 如果答案仍然相同,请让我知道我的代码有什么问题。谢谢!
Lehrian

48

您还可以执行以下操作。在您的表格类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元组的列表。希望这可以帮助。


5
也许值得注意的是,值initial指的是要选择的项目的键,而不是其索引。花了我一些尝试来解决这个问题!
BigglesZX 2014年

20

我也遇到了这个问题,并发现问题出在浏览器中。刷新时,浏览器将使用与以前相同的值重新填充表单,而忽略选中的字段。如果查看源,则将看到检查值正确。或将光标放在浏览器的URL字段中,然后按Enter。这将从头开始重新加载表单。


1
只是,这仍然发生在FF6中。按下刷新按钮还不够。但是在Google chrome浏览器中,刷新按钮就足够了,无需去地址栏
mhd

1
我认为这将始终在Firefox中发生;这是预期的行为。
同行2012年

仍然发生在Chrome 83中,您救了我的命!
lapin

7

汤姆(Tom)和伯顿(Burton)的答案最终都对我有用,但是我很难弄清楚如何将它们应用于a ModelChoiceField

唯一的窍门是将选择存储为的元组(<model's ID>, <model's unicode repr>),因此,如果要设置初始模型选择,则将模型的ID作为初始值传递,而不是对象本身,名称或其他任何名称。然后就这么简单:

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

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

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

1
在少数情况下,您需要在GET请求后设置表单的初始值并在视图中进行设置,在这种情况下,第二行代码可以完美运行。
kstratis

3

Dave-寻找浏览器问题的解决方案有运气吗?有办法强制刷新吗?

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

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')

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 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.