【问题标题】:How to Change CharField Choice List Behaviour如何更改 CharField 选择列表行为
【发布时间】:2026-01-24 11:45:01
【问题描述】:

如下所示,我有 CharField 模型。用户可以选择 ROLE_CHOICE 中的值之一。

问题:如何使某些值不可用,但您仍然可以在选择中看到它们。

目前,我尝试了以下代码,但它使某些值不可见,这不是我想要的(我希望它们被禁用,而不是不可见)。

model.py

ROLE_CHOICES = (
        ('manager', 'Manager'),
        ('developer', 'Developer'),
        ('business_analyst', 'Business analyst'),
        ('system_analysts', 'System analysts'),
)


class Membership (models.Model):
    ***OTHER FIELDS***
    role = models.CharField(max_length=20, choices=ROLE_CHOICES,)

forms.py

class MembershipForm(forms.ModelForm):
    class Meta:
        model = Membership
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(MembershipForm, self).__init__(*args, **kwargs)
        self.fields['role'].choices = tuple(choice for choice in ROLE_CHOICES if choice[0] not in ['developer'])

【问题讨论】:

    标签: python django python-3.x django-forms django-1.9


    【解决方案1】:

    编辑: 将禁用更改为内部列表中的位置 0! forms.py

    class MembershipForm(forms.ModelForm):
        class Meta:
            model = Membership
            fields = '__all__'
    
        def __init__(self, *args, **kwargs):
            super(MembershipForm, self).__init__(*args, **kwargs)
            self.fields['role'].choices = tuple(choice if choice[0] not in ['developer'] else ({"label":choice[1],"disabled":True},choice[0]) for choice in ROLE_CHOICES )
    

    这里,

    tuple(choice if choice[0] not in ['developer'] else ({"label":choice[1],"disabled":True},choice[0]) for choice in ROLE_CHOICES )
    

    会给

    (('manager', 'Manager'), ( {'disabled': True, 'label': 'developer'}, Developer), ('business_analyst', 'Business analyst'), ('system_analysts', 'System analysts'))
    

    即对于所有需要禁用的字段,都需要添加标签和禁用属性!

    这应该可以解决问题!

    希望对你有帮助!

    【讨论】:

    • 您好,我尝试了您的代码,但不幸的是它没有工作。它仍然可以选择。我在帖子中添加了图片。你可以看到它的样子,请检查一下。你有什么想法吗?
    • 我已添加编辑!如果您仍然有错误,请告诉我!
    • 我测试过了。它仍然可选择用户可以选择开发人员,但表单验证有效。事实上,这不是你所需要的。您如何看待我可能需要在模板中而不是在表单中禁用选择。请再看一遍。我编辑图片。
    • 感谢您提供此链接,但尝试使用此自定义小部件时出现此错误:` from django.utils.encoding import force_unicode ImportError: cannot import name 'force_unicode'` 我现在真的很困惑。
    • 在官方文档中我发现force_unicode的新名称是force_text。我将其更改为 force_text 但开发人员仍然可以选择。好难过=(