在Django forms.ChoiceField上设置所选值

the*_*ife 105 django django-models django-forms

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

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

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

我通过Google发现的一些结果表明可以设置初始值,但我从来没有设法让它工作!顺便说一句,我在django 1.0上.

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

非常感谢.

Tom*_*Tom 108

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

form = MyForm(initial={'max_number': '3'})
Run Code Online (Sandbox Code Playgroud)

  • '3'是对应于元组的第一个值还是第二个值? (2认同)
  • 元组表示选项的(值,标签)对,并且您希望指定初始值 - 因此"3"指的是第一个项目. (2认同)

col*_*nta 88

这并不涉及眼前的问题,但是这个Q/A会出现与尝试将所选值分配给a相关的搜索ChoiceField.

如果您已经super().__init__在Form类中调用过,则应该更新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'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.正如你所说,它与OP并不完全相关,但它解决了我在Google上搜索的问题! (6认同)
  • 如果您不理解这个答案,请阅读[django form gotchas](http://www.avilpage.com/2015/03/django-form-gotchas-dynamic-initial.html) (2认同)

小智 41

您还可以执行以下操作.在你的表单类def:

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

然后在视图中调用表单时,您可以动态设置初始选项和选择列表.

yourFormInstance = YourFormClass()

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)]
yourFormInstance.fields['max_number'].initial = [1]
Run Code Online (Sandbox Code Playgroud)

注意:初始值必须是一个列表,选项必须是2元组,在我上面的示例中,我有一个2元组的列表.希望这可以帮助.

  • 也许值得注意的是,`initial`的值是指要选择的项的键,而不是其索引.我花了几个尝试来解决这个问题! (4认同)

Dav*_*ave 18

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


orl*_*ade 6

汤姆和伯顿的答案最终都适合我,但我在弄清楚如何将它们应用到一个方面时遇到了一些麻烦ModelChoiceField.

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

form = EmployeeForm(initial={'manager': manager_employee_id})
Run Code Online (Sandbox Code Playgroud)

或者,initial可以忽略该参数来代替额外的行:

form.fields['manager'].initial = manager_employee_id
Run Code Online (Sandbox Code Playgroud)

  • 在一种罕见的情况下,您的第二行代码可以完美地工作,在这种情况下,您需要在“GET”请求之后设置表单的初始值并从视图中设置它。 (2认同)