根据登录用户过滤Django Admin用户列表

时间:2020-01-10 12:15:33

标签: python django

因此,我正在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
        )

但是它不起作用。它仍然向我显示完整列表。

1 个答案:

答案 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:组分离

按机构创建组,并在注册(用户创建阶段)期间将用户添加到组中