所有
我研究了这几天,似乎找不到我想要的东西。我很清楚使用以下方法来禁用Django表单中的字段:
self.fields['author'].disabled = True
以上将完全禁用某个字段。我试图显示一个带有多个选择选项的复选框,但我希望自动选择和禁用其中一个选项,以便用户无法将其更改为他们选择的选项之一。这是我用来显示复选框的代码,它运行正常:
self.fields['author'] = forms.ModelMultipleChoiceField(
queryset=User.objects.all(),
widget=forms.CheckboxSelectMultiple(),
initial = user.favorite)
user.favorite正在按照我的预期显示,但我想禁用它以便仍然检查它,但用户无法更改它,但他们仍然可以在复选框中选择其他人。这可能吗?提前谢谢。
答案 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
值)。