8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 Django forms.ChoiceField 上设置选定的值

KidSudi 3月前

86 0

以下是表单中的字段声明:max_number = forms.ChoiceField(widget = forms.Select(), choice = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,) 我想要...

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

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

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

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

我正在使用 Django 1.0

帖子版权声明 1、本帖标题:在 Django forms.ChoiceField 上设置选定的值
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由KidSudi在本站《django》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我一直在想同样的事情。在最新的主干版本中,'initial' 似乎也无法与选择配合使用。

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

    form = MyForm(initial={'max_number': '3'})
    
  • 元组代表选项的(值,标签)对,并且您想要指定初始值 - 因此“3”指的是第一项。

  • 这并没有触及当前的问题,但这个问答出现在与尝试将选定的值分配给 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'
    
  • 我不确定是不是因为这个答案太旧了,以至于不再有效,但我无法让这个解决方案起作用。我尝试了上述所有组合,但仍然没有得到任何结果。我在这里再次提出了这个问题:.com/questions/52191096/… 如果答案仍然相同,请告诉我我的代码有什么问题。谢谢!

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

    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 的值指的是要选择的项的键,而不是其索引。我尝试了几次才弄明白!

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

  • 仅供参考,这种情况在 FF6 中仍然会发生。按刷新按钮是不够的。但在谷歌浏览器中,刷新按钮就足够了,无需转到地址栏

  • 引用 11

    汤姆和伯顿的答案最终都对我有用,但我在弄清楚如何将它们应用于 麻烦 时遇到了一些 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 请求后设置表单的初始值并从视图中设置它,此时您的第二行代码可以完美运行。

  • 引用 13

    我确认,这是使用 ModelChoiceField (遗憾的是,是 Django 2.1) 使其工作的唯一方法。也许在较新的版本中效果会更好。

  • 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: 实例应该始终修改 self.fields;它们不应该修改 self.base_fields。

  • 注意:这个答案非常全面,重点关注静态和动态初始值,因为这个问答涉及与动态改变初始值相关的搜索,我相信下面的信息对初级程序员很有用。

    如何设置初始值

    多种方法可以设置 (或任何其他字段,例如 ChoiceField DecimalField 。各种选项可以是

    • 静态 (即初始值不变),
    • 表单动态 (即可以在表单构造函数中计算/更改初始值 forms.py ),
    • 视图动态 (即可以在中计算/改变初始值 view.py )。

    下面介绍的所有选项 都可以组合 ,但要注意 初始值的优先级

    选项 A - 类中定义的静态初始值

    您可以在表单类的字段定义中设置初始值。此选项仅为静态的。

    forms.py

    class MyForm(forms.Form):
         max_number = forms.ChoiceField(initial='3')
    

    选项 B - 在实例构造函数中定义初始值

    您可以在创建表单实例时设置初始值。此选项可以是静态的,也可以是表单动态的。

    forms.py

    class MyForm(forms.Form):
        max_number = forms.ChoiceField()
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.initial['max_number'] = '3'
    

    您也可以使用 self.fields['max_number'].initial = '3' self.initial['max_number'] = '3' 不建议 这样做, 除非您希望 初始值可以被覆盖 .

    选项 C - 表单调用中的初始值

    您可以在表单调用的参数中设置初始值。此选项可以是静态的,也可以是视图动态的。

    views.py

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

    选项 D - 使用关键字参数的初始值

    You can also send the initial value as a keyword argument (kwarg) to the form constructor, and then use this kwarg as the initial value. This option can be static, form-dynamic or view-dynamic.

    views.py

    my_form = MyForm(my_init_kwarg=3)
    

    forms.py

    class MyForm(forms.Form):
        max_number = forms.ChoiceField()
        def __init__(self, *args, **kwargs):
            if 'my_init_kwarg' in kwargs:
                init_val = kwargs.pop('my_init_kwarg')
            else:
                init_val = 1  # fallback value if kwarg is not provided
            super().__init__(*args, **kwargs)
            self.initial['max_number'] = init_val
    

    注意:第 4 至 7 行可以简化为 init_val = kwargs.pop('my_init_kwarg', 1)

    选项 E - 创建绑定表格

    You can create the form as a bound form and pass the initial value as the data for the bound form. This option can be static or view-dynamic.

    views.py

    form_data = {'max_number':3}
    my_form = MyForm(form_data)
    

    forms.py

    class MyForm(forms.Form):
        max_number = forms.ChoiceField()
    

    有关绑定和非绑定表单的更多信息,请参阅 Django 文档 .

    ChoiceFields 的附加说明

    请注意, 要选择的项的 此答案 。因此,如果您有此选择列表

    choices = ([('3','three'), ('2','two'), ('1','one')]) 
    

    并希望将其设置 one 为初始值,您可以使用

    max_number = forms.ChoiceField(initial='1')
    
  • 为确保万无一失,我需要查看您如何呈现表单。初始值仅在未绑定的表单中使用,如果已绑定且未包含该字段的值,则不会选择任何内容。

返回
作者最近主题: