В 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`, без возникающих ошибок прав доступа.