禁用多选 Django 小部件中的选择

Posted

技术标签:

【中文标题】禁用多选 Django 小部件中的选择【英文标题】:Disable choices in multiselect Django widget 【发布时间】: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)

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

【问题讨论】:

【参考方案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 内置的。

以上是关于禁用多选 Django 小部件中的选择的主要内容,如果未能解决你的问题,请参考以下文章

如何对 Django Select 小部件中的选择进行分组?

Django:使用小部件来限制 ModelForm 中的选择

Django 中的复杂表单小部件

Django Admin FilteredSelectMultiple 小部件选择不起作用

有没有办法在 python 的 streamlit 包的多选小部件中添加“全选”选项?

php 小部件多选小部件