【问题标题】:Setting the selected value on a Django forms.ChoiceField在 Django forms.ChoiceField 上设置选定的值
【发布时间】:2010-10-14 01:03:24
【问题描述】:

这是表单中的字段声明:

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

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

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

我正在使用 Django 1.0

【问题讨论】:

  • 我一直在想同样的事情。 “初始”也不适用于最新中继版本中的选择。

标签: django django-models django-forms


【解决方案1】:

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

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 元组列表。希望这会有所帮助。

【讨论】:

  • 也许值得注意的是,initial 的值是指要选择的项目的键,而不是它的索引。我试了几次才解决这个问题!
【解决方案2】:

这并没有涉及手头的直接问题,但此 Q/A 用于搜索与尝试将所选值分配给 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'

【讨论】:

  • 如果你不明白这个答案,阅读这个django form gotchas
  • 我不确定是不是因为这个答案太旧了以至于不再有效,但我无法使这个解决方案工作。我已经尝试了上述所有组合,但我仍然没有得到爱。我在这里再次问了这个问题:stackoverflow.com/questions/52191096/… 如果答案仍然相同,请告诉我我的代码有什么问题。谢谢!
【解决方案3】:

Tom 和 Burton 的答案最终都对我有用,但我在弄清楚如何将它们应用于 ModelChoiceField 时遇到了一些麻烦。

唯一的窍门是选择被存储为(<model's ID>, <model's unicode repr>)的元组,所以如果你想设置初始模型选择,你传递模型的ID作为初始值,而不是对象本身或它的名称或其他任何东西。那么就这么简单:

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

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

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

【讨论】:

  • 您的第二行代码在您需要在GET 请求后设置表单的初始值并从视图中设置的少数情况下完美运行。
【解决方案4】:

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

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

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

【讨论】:

  • 这看起来不太好。引自 django 1.3,forms.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
【解决方案5】:

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

【讨论】:

  • 仅供参考,这仍然发生在 FF6 中。按下刷新按钮是不够的。但是在google chrome中刷新按钮就够了,不用去地址栏
  • 我认为它总是会在 Firefox 中发生;这是预期的行为。
【解决方案6】:

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

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

【讨论】:

  • '3'对应元组的第一个值还是第二个?
  • 元组代表选项的(值,标签)对,您要指定初始值 - 所以“3”指的是第一项。
【解决方案7】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2021-11-21
    相关资源
    最近更新 更多