如何在Django Admin创建实例时让ManyToManyField仅显示超级用户
Django Admin中限制多选框仅显示超级用户的方法
针对你的Category模型多对多字段users的需求,要在Admin页面创建实例时只显示超级用户,有两种常用实现方式:
方法一:重写ModelAdmin的formfield_for_manytomany方法
在项目的admin.py中,为Category模型自定义ModelAdmin类,通过重写formfield_for_manytomany方法过滤用户查询集:
# admin.py from django.contrib import admin from .models import Category from django.conf import settings User = settings.AUTH_USER_MODEL @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == 'users': # 仅保留超级用户作为可选选项 kwargs['queryset'] = User.objects.filter(is_superuser=True) return super().formfield_for_manytomany(db_field, request, **kwargs)
方法二:自定义ModelForm
通过创建自定义表单,在表单初始化时修改users字段的查询集:
# admin.py from django.contrib import admin from django import forms from .models import Category from django.conf import settings User = settings.AUTH_USER_MODEL class CategoryForm(forms.ModelForm): class Meta: model = Category fields = '__all__' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 过滤出仅超级用户的选项 self.fields['users'].queryset = User.objects.filter(is_superuser=True) @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): form = CategoryForm
两种方法都能实现相同的效果,你可以根据项目的代码结构习惯选择其中一种。
内容的提问来源于stack exchange,提问作者nino
相关产品推荐
相关产品推荐

