当前位置:  开发笔记 > 后端 > 正文

choiceField的"禁用"选项 - Django

如何解决《choiceField的"禁用"选项-Django》经验,为你挑选了3个好方法。

我遇到一个简单的问题:如何通过modelForm生成的下拉菜单中有一些"禁用"字段,并在django Framework中选择了什么?

目前,我无法弄清楚如何获得这样的输出: - 根1条目 - (禁用) - Elt 1 - (未禁用) - 根2条目 - (禁用)

你有什么建议吗?

皮埃尔



1> Jarret Hardi..:

Django的表单小部件提供了一种传递应该在标记上呈现的属性列表的方法:

my_choices = ( ('one', 'One'), ('two', 'Two'))
class MyForm(forms.Form):
    some_field = forms.ChoiceField(choices=my_choices, 
                                   widget=forms.Select(attrs={'disabled':'disabled'}))

不幸的是,这对您不起作用,因为该属性将应用于呈现的每个选项标记.Django无法自动知道哪些应该启用以及哪些应该被禁用.

在您的情况下,我建议编写自定义小部件.这很容易做到,而且你没有那么多的自定义逻辑可以应用.关于这方面的文档就在这里.简而言之:

子类forms.Select,它是默认的选择渲染器

在您的子类中,实现该render(self, name, value, attrs)方法.使用您的自定义逻辑来确定是否有value资格需要禁用.有一个在很短的实施renderdjango/forms/widgets.py,如果你需要inspriation.

然后,定义表单字段以使用自定义窗口小部件:

class MyForm(forms.Form):
    some_field = forms.ChoiceField(choices=my_choices, 
                                   widget=MyWidget)



2> vkrams..:

您可以像这样创建布莱恩所提到的选择.在以下选项Root 1中,Root 2会自动禁用,它们看起来像Group Options

CHOICES = (
  ('-- Root 1--', 
      (
        ('ELT1', 'ELT1'),
        ('ELT2', 'ELT2'),
        ('ELT3', 'ELT3'),
      )
   ),
  ('-- Root 2--', 
      (
        ('ELT3', 'ELT3'),
        ('ELT4', 'ELT4'),
      )
  ),
)

以上选项将显示如下.在下图中,根1和根2不可选.

在此输入图像描述

希望这能解决你的问题

-Vikram



3> 小智..:
field_choices = (
        ('','Make choice'),
        (1,'first'),
        (2,'second'),
        (3,'third')
    )

from django.forms import Select

class Select(Select):
    def create_option(self, *args,**kwargs):
        option = super().create_option(*args,**kwargs)
        if not option.get('value'):
            option['attrs']['disabled'] = 'disabled'

        if option.get('value') == 2:
            option['attrs']['disabled'] = 'disabled'

        return option

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有