В Django есть несколько способов ограничить модели в админке по группам. Рассмотрим два самых распространенных способа.
1. Использование ModelAdmin
и GroupRequiredMixin
:
- Создайте класс, который наследуется от admin.ModelAdmin
.
- В этом классе определите get_queryset
метод, который будет возвращать объекты только для пользователей из определенной группы.
- Затем создайте класс GroupRequiredMixin
, который будет проверять, принадлежит ли пользователь к определенной группе перед доступом к административному разделу.
- Наконец, создайте класс MyModelAdmin
, который наследуется от ModelAdmin
и GroupRequiredMixin
, и укажите его для вашей модели в административной конфигурации.
Пример кода:
from django.contrib import admin class MyModelAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super().get_queryset(request) user = request.user if user.groups.filter(name='MyGroup').exists(): return qs # Фильтруем объекты только для пользователей из группы "MyGroup" return qs.none() # Возвращаем пустой QuerySet для всех остальных пользователей class GroupRequiredMixin: def has_permission(self, request): user = request.user return user.groups.filter(name='MyGroup').exists() admin.site.register(MyModel, MyModelAdmin)
2. Использование декоратора @user_passes_test
:
- Создайте функцию, которая будет проверять, принадлежит ли пользователь к определенной группе.
- Декорируйте вашу функцию с помощью декоратора @user_passes_test
.
- Затем создайте класс MyModelAdmin
, который наследуется от ModelAdmin
, и укажите его для вашей модели в административной конфигурации.
Пример кода:
from django.contrib import admin from django.contrib.auth.decorators import user_passes_test def in_my_group(user): return user.groups.filter(name='MyGroup').exists() class MyModelAdmin(admin.ModelAdmin): pass admin.site.register(MyModel, MyModelAdmin) admin.site.register(MyModel, MyModelAdmin) @user_passes_test(in_my_group) def my_view(request): ...
Оба этих способа позволяют ограничить доступ к моделям по группам пользователей в админке Django. В зависимости от ваших потребностей вы можете выбрать наиболее удобный для вас способ.