choiceField的"禁用"选项 - Django

Pie*_*rre 21 django

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

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

你有什么建议吗?

皮埃尔

Jar*_*die 21

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

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

不幸的是,这对您不起作用,因为该属性将应用于呈现的每个选项标记.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)
Run Code Online (Sandbox Code Playgroud)


jac*_*nye 7

这可能是一个迟到的答案,但这是一个可以使用表单实例进行修改的简化版本。

您可以传递要禁用的值列表,即

def __init__(self, disabled_choices, *args, **kwargs):
        self.disabled_choices = disabled_choices
Run Code Online (Sandbox Code Playgroud)

或者

from django.forms import Select


class SelectWidget(Select):
    """
    Subclass of Django's select widget that allows disabling options.
    """
    def __init__(self, *args, **kwargs):
        self._disabled_choices = []
        super(SelectWidget, self).__init__(*args, **kwargs)

    @property
    def disabled_choices(self):
        return self._disabled_choices

    @disabled_choices.setter
    def disabled_choices(self, other):
        self._disabled_choices = other

    def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
        option_dict = super(SelectWidget, self).create_option(
            name, value, label, selected, index, subindex=subindex, attrs=attrs
        )
        if value in self.disabled_choices:
            option_dict['attrs']['disabled'] = 'disabled'
        return option_dict
Run Code Online (Sandbox Code Playgroud)

根据条件禁用选项,即用户不是超级用户。

class MyForm(forms.Form):
    status = forms.ChoiceField(required=True, widget=SelectWidget, choices=(('on', 'On'), ('off', 'Off')))

    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)

        if not request.user.is_superuser:
            self.fields['status'].widget.disabled_choices = ['off']
Run Code Online (Sandbox Code Playgroud)


vkr*_*ams 5

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

CHOICES = (
  ('-- Root 1--', 
      (
        ('ELT1', 'ELT1'),
        ('ELT2', 'ELT2'),
        ('ELT3', 'ELT3'),
      )
   ),
  ('-- Root 2--', 
      (
        ('ELT3', 'ELT3'),
        ('ELT4', 'ELT4'),
      )
  ),
)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

希望这能解决你的问题

-Vikram


小智 5

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
Run Code Online (Sandbox Code Playgroud)