【问题标题】:Disable Choice In ModelMultipleChoiceField CheckBoxSelectMultiple Django在 ModelMultipleChoiceField CheckBoxSelectMultiple Django 中禁用选择
【发布时间】:2018-08-02 19:22:07
【问题描述】:

全部,

我已经对此进行了几天的研究,但似乎无法找到我要查找的内容。我很清楚使用以下内容来禁用 Django 表单中的字段:

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

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

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

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

【问题讨论】:

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


    【解决方案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 值)。

    【讨论】:

    • 我想使用这个解决方案,但是当我使用CheckboxSelectMultipleWithDisabledOption 时,永远不会调用方法create_option。如果我使用 SelectMultiple(而不是 CheckboxSelectMultiple)作为父类,则确实调用了方法 create_option。知道为什么吗?
    猜你喜欢
    • 2013-03-31
    • 2019-03-03
    • 2012-03-19
    • 1970-01-01
    • 2012-01-31
    • 2016-10-17
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多