在Django forms.ChoiceField上设置所选值

时间:2009-03-18 09:57:02

标签: django django-models django-forms

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

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

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

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

我正在使用Django 1.0

8 个答案:

答案 0 :(得分:106)

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

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

答案 1 :(得分:80)

这不会触及手边的当前问题,但会针对与尝试将所选值分配到ChoiceField相关的搜索进行此问答。

如果您已在Form类中调用super().__init__,则应更新form.initial字典,而不是field.initial属性。如果您在调用form.initial后学习print self.initial(例如super().__init__),则会包含所有字段的值。在该字典中具有值None将覆盖field.initial值。

e.g。

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'

答案 2 :(得分:39)

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

答案 3 :(得分:18)

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

答案 4 :(得分:6)

汤姆和伯顿的答案最终都适合我,但我在确定如何将它们应用到ModelChoiceField时遇到了一些麻烦。

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

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

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

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

答案 5 :(得分:3)

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

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

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value

答案 6 :(得分:1)

确保我需要了解您如何呈现表单。初始值仅以未绑定的形式使用,如果它已绑定且未包含该字段的值,则不会选择任何值。

答案 7 :(得分:-3)

试试这个对我有用,我在models.py中添加了这个

options = (
    ('1','1'),
    ('2','2'),
    ('3','3')
)

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')