首页 > 解决方案 > 使用 ModelChoiceField 在 Django Select Widget 中禁用选项

问题描述

我试图在表单的“选择”小部件中将非活动用户显示为“已禁用”。

我有一个 django 用户模型的工人。

模型.py

class Task(models.Model):
    worker = models.ForeignKey(settings.AUTH_USER_MODEL, models.DO_NOTHING, blank=True, null=True,related_name='worker')

它由一个 ModelForm 表示,使用一个子类来显示用户的全名。

表格.py

class UserModelChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
         return obj.get_full_name()

class TaskForm(forms.ModelForm):
    worker = UserModelChoiceField(queryset=User.objects.filter(is_active=1).order_by('first_name'),widget=forms.Select(attrs={'class':'form-control'}),required=False)
    class Meta:
        model = Task
        fields = ['worker']

目前,过滤器 is_active=1 意味着非活动用户根本不会显示在列表中,并且在他们已经被选中的位置显示为“---”。

我的理想是它们出现但呈灰色显示,因此它们被呈现但无法选择。

从审查https://djangosnippets.org/snippets/2453/

我在 choiceField的“禁用”选项中找到的 - Django

我能够得出结论,选择的子类应该可以工作。但是我不知道如何在查询集和小部件之间进行获取以达到预期的结果。阅读表明小部件上的渲染方法可能是这种方式,但我找不到如何传递信息或调用 create_option 的确切位置的示例。

标签: pythondjangopython-3.xdjango-formsdjango-1.11

解决方案


推荐阅读