在ModelMultipleChoiceField中禁用选择CheckBoxSelectMultiple Django

时间:2018-02-22 19:44:24

标签: python-3.x django-models django-forms django-templates django-views

所有

我研究了这几天,似乎找不到我想要的东西。我很清楚使用以下方法来禁用Django表单中的字段:

self.fields['author'].disabled = True

以上将完全禁用某个字段。我试图显示一个带有多个选择选项的复选框,但我希望自动选择和禁用其中一个选项,以便用户无法将其更改为他们选择的选项之一。这是我用来显示复选框的代码,它运行正常:

self.fields['author'] = forms.ModelMultipleChoiceField(
                        queryset=User.objects.all(),  
                        widget=forms.CheckboxSelectMultiple(),
                        initial = user.favorite)

user.favorite正在按照我的预期显示,但我想禁用它以便仍然检查它,但用户无法更改它,但他们仍然可以在复选框中选择其他人。这可能吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

我创建了一个覆盖了一种方法的自定义窗口小部件:

MY_OPTION = 0
DISABLED_OPTION = 1
ITEM_CHOICES = [(MY_OPTION, 'My Option'), (DISABLED_OPTION, 'Disabled Option')]

class CheckboxSelectMultipleWithDisabledOption(forms.CheckboxSelectMultiple):

    def create_option(self, *args, **kwargs):
        options_dict = super().create_option(*args, **kwargs)

        if options_dict['value'] == DISABLED_OPTION:
            options_dict['attrs']['disabled'] = ''

        return options_dict

然后采用以下格式:

class MyForm(forms.Form):

    items = forms.MultipleChoiceField()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['items'].widget = CheckboxSelectMultipleWithDisabledOption()
        self.fields['items'].choices = ITEM_CHOICES

对于更复杂的情况,您可以覆盖自定义窗口小部件的__init__并在其中传递其他参数(在我的情况下,我必须传递表单的initial值)。

相关问题