【问题标题】:Disable choices in multiselect Django widget禁用多选 Django 小部件中的选择
【发布时间】:2020-09-24 22:03:00
【问题描述】:

是否可以在 Django 多选小部件中禁用一些选择选项?

我可以在视图中做这样的事情:

        id_roles = (10, 2, 1, 3, 11)
        self.fields['role'].queryset = Role.objects.filter(id__in=id_roles)

但是,当保存具有该列表之外的值的绑定表单时,这会引发错误。我可以拥有那里的所有角色,只是被禁用吗?

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    您必须设置自己的自定义小部件才能实现此类行为。

    from django import forms
    
    class MyWidget(forms.SelectMultiple):
    
        def __init__(self, *args, **kwargs):
            self.active_choices = kwargs.pop('active_choices', [])
            super().__init__(*args, **kwargs)
    
        def create_option(self, name, value, *args, **kwargs):
            option = super().create_option(name, value, *args, **kwargs)
            option['attrs']['disabled'] = value not in self.active_choices
            return option
    
    
    class MyForm(forms.Form):
    
        role = forms.ModelMultipleChoiceField(
            queryset=Role.objects.all(), widget=MyWidget())
    
        def __init__(self, *args, **kwargs):
            active_choices = kwargs.pop('active_choices', None)
            super().__init__(*args, **kwargs)
            if active_choices:
                self.fields['role'].widget.active_choices = active_choices
    

    【讨论】:

    • 我希望他们在那里但被禁用,而不是排除他们。
    • 然后您必须创建自己的字段和您自己的小部件。这不是开箱即用的 Django 内置的。
    猜你喜欢
    • 2023-03-07
    • 2010-12-14
    • 2011-07-28
    • 2012-06-10
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多