Почему обычный администратор (с правом is_staff) не имеет доступа к админке Django, и каким образом это можно исправить?

Как настроить админку Django так, чтобы обычные администраторы, обладающие правом `is_staff`, имели доступ ко всем моделям, кроме модели `User`, и чтобы при этом не возникала ошибка "You don’t have permission to view or edit anything." при входе в систему?
  • 4 января 2025 г. 16:53
Ответы на вопрос 2
В Django права доступа к админке определяются через модели и права, ассоциированные с каждой моделью. Простой флаг `is_staff` не предоставляет доступ ко всем моделям в админке. Для доступа к моделям админки необходимо назначить соответствующие права на уровне модели.

### Причина отсутствия доступа

1. Флаг `is_staff` только указывает, что пользователь может войти в админку, но для доступа к конкретным моделям пользователь должен иметь права `add`, `change`, `delete` или `view` для этих моделей.
2. По умолчанию, только суперпользователи (`is_superuser`) имеют доступ ко всем моделям.

### Как настроить доступ для обычных администраторов

Чтобы настроить так, чтобы обычные администраторы имели доступ ко всем моделям, кроме модели `User`, можно следовать этим шагам:

1. **Создание пользовательской группы** (например, "Ordinary Admin") и назначение прав:

   ```python
   from django.contrib.auth.models import Group, Permission
   from django.contrib.contenttypes.models import ContentType
   from django.contrib.auth.models import User
   
   # Создаем группу
   group, created = Group.objects.get_or_create(name='Ordinary Admin')

   # Получаем разрешения для нужных моделей
   content_types = ContentType.objects.all()
   for content_type in content_types:
       # Получаем все разрешения для модели
       permissions = Permission.objects.filter(content_type=content_type)
       
       # Далее добавляем эти разрешения в группу, если это не модель User
       if content_type.model != 'user':  # исключить модель User
           group.permissions.add(*permissions)

   # Можно назначить пользователя в группу
   user = User.objects.get(username='username')  # замените на своего пользователя
   user.groups.add(group)
   ```

2. **Привязка разрешений к пользователю**:

   Убедитесь, что ваш обычный администратор включен в группу "Ordinary Admin", и у него есть соответствующие права.

3. **Проверка и внесение изменений через админку**:

   Перейдите в админку под учетной записью вашего обычного администратора и проверьте, что все настройки выполнены корректно. Если были проблемы с правами, проверьте, назначены ли правильно права.

4. **Дополнительные настройки**: 
   
   Если вы хотите, чтобы администраторы видели только определенные модели, вы можете переопределить админку для этих моделей с помощью `ModelAdmin` и изменить `get_queryset` или `has_view_permission`.

```python
from django.contrib import admin
from .models import MyModel

class MyModelAdmin(admin.ModelAdmin):
    def has_view_permission(self, request, obj=None):
        return request.user.groups.filter(name='Ordinary Admin').exists()

admin.site.register(MyModel, MyModelAdmin)
```

5. **Тестирование**: 

   После выполнения настроек, проверьте, может ли обычный администратор войти в админку и получить доступ к нужным моделям (кроме модели User).

Эти шаги позволят вашему обычному администратору получить доступ ко всем моделям, кроме модели `User`, без возникающих ошибок прав доступа.
Ну так стаффу надо явно выдать разрешения User permissions на каждую модель, либо добавить в группу Groups в которой эти разрешения выданы. Зайди админом в редактирование юзера
Похожие вопросы