禁用多选 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 Admin FilteredSelectMultiple 小部件选择不起作用