Как в django ограничить модели в админке по группам?

В 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. В зависимости от ваших потребностей вы можете выбрать наиболее удобный для вас способ.