因此,我正在Django Admin中构建学校管理系统。该学校有多个机构,我们希望建立仅能操纵该机构的学生,教师等数据的管理员。例如:如果管理员用户是ABC学院,则他/她应该只能编辑ABC学生,教师等的数据。
这是我的自定义用户和研究所模型:
class Institute(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class User(AbstractUser):
"""
Our own User model. Made by overriding Django's own AbstractUser model.
We need to define this as the main user model in settings.py with
variable AUTH_USER_MODEL *IMPORTANT*
"""
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.EmailField(
max_length=255,
unique=True,
verbose_name="email address"
)
institute = models.ForeignKey(
Institute, on_delete=models.SET_NULL, null=True)
objects = MyUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email
每个研究所都有一个域负责人:
class DomainPrincipal(User):
is_admin = True
def __str__(self):
return self.first_name+" "+self.last_name
# Control model features
class Meta:
verbose_name = 'Domain Principal'
verbose_name_plural = 'Domain Principals'
我创建了以下自定义管理员,以仅显示当前管理员用户所属的研究所的域主体:
@admin.register(UserPrincipal)
class DomainPrincipalAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'institute')
def queryset(self, request):
qs = super(DomainPrincipalAdmin, self).queryset(request)
return qs.filter(
institute=request.user.institute
)
但是它不起作用。它仍然向我显示完整列表。
答案 0 :(得分:3)
解决方案1: 使用机构名称过滤 无需更改大部分代码:
覆盖 get_queryset , 诸如此类(未经测试,请视为伪代码)
class DomainPrincipalAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user:
current_instituition_name = user.instituition_name
qs = qs.filter(institute = current_instituition_name)
return qs
解决方案2:数据库分离
每个研究所保留单独的数据库并执行 Try this API
解决方案3:组分离
按机构创建组,并在注册(用户创建阶段)期间将用户添加到组中