114

这是表单中的字段声明:

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

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

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

我正在使用 Django 1.0

4

7 回答 7

124

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

form = MyForm(initial={'max_number': '3'})
于 2009-03-20T09:04:41.510 回答
109

这并没有触及手头的直接问题,但是这个 Q/A 用于与尝试将所选值分配给 a 相关的搜索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'
于 2012-07-09T18:04:22.010 回答
62

您还可以执行以下操作。在您的表单类定义中:

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 元组列表。希望这可以帮助。

于 2010-07-01T21:14:38.500 回答
22

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

于 2009-12-02T15:29:45.073 回答
7

汤姆和伯顿的答案最终都对我有用,但我在弄清楚如何将它们应用于ModelChoiceField.

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

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

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

form.fields['manager'].initial = manager_employee_id
于 2011-02-27T09:45:02.433 回答
3

戴夫 - 找到解决浏览器问题的方法有什么运气吗?有没有办法强制刷新?

至于原来的问题,在初始化表单的时候尝试如下:

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value
于 2010-01-13T21:27:46.837 回答
1

可以肯定的是,我需要看看您是如何呈现表单的。初始值仅用于未绑定的表单,如果已绑定且未包含该字段的值,则不会选择任何内容。

于 2009-03-18T12:06:46.167 回答