Фильтр Django Админ-лист пользователя по зарегистрированному пользователю - PullRequest
0 голосов
/ 10 января 2020

Итак, я создаю систему управления школой в Django Admin. В этой школе есть несколько учреждений, и мы хотим создать администраторов, которые могут манипулировать только данными учеников, учителей и т. Д. c. этого определенного института. Например: если пользователь с правами администратора института AB C, он / она должен иметь возможность редактировать только данные студентов AB C, преподавателей и т. Д. c.

Вот моя пользовательская модель пользователя и института:

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 Ответ

3 голосов
/ 13 января 2020

Решение 1: фильтрация по названию организации Не меняя большую часть кода:

переопределить get_queryset , что-то вроде (не проверено, пожалуйста, рассмотрите его как psuedo -код)

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: Разделение БД

Сохранение отдельных БД для каждого института и выполнение Маршрутизация БД

Решение 3: Разделение группы

Создание групп для каждого учреждения и добавление пользователей в группы во время регистрации (этап создания пользователя)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...