Атрибут is_staff

Атрибут is_staff класса User является булевым полем, которое указывает, может ли пользователь входить в административную панель Django. Он используется для разграничения доступа к интерфейсу администратора: если атрибут установлен в True, пользователь считается персоналом и получает доступ к админке, при условии что он также аутентифицирован и активен. Этот атрибут не предоставляет автоматически никаких дополнительных прав на изменение данных, но служит первым уровнем проверки при доступе к административному интерфейсу.

Синтаксис

Атрибут доступен для чтения и записи у экземпляра модели User:

pythonfrom django.contrib.auth.models import User

user = User.objects.get(username='john')
if user.is_staff:
  print("User is staff member")
else:
  print("User is not staff member")

При создании нового пользователя атрибут по умолчанию имеет значение False. Для создания суперпользователя с установленным is_staff=True используется специальная команда или метод:

pythonfrom django.contrib.auth.models import User

# Создание обычного пользователя
user = User.objects.create_user(username='john', password='pass123')
print(user.is_staff)  # Выведет: False

# Создание пользователя с правами персонала
staff_user = User.objects.create_user(username='admin', password='admin123')
staff_user.is_staff = True
staff_user.save()

Пример . Со списком пользователей

Получим список всех пользователей и выведем информацию о том, является ли каждый из них персоналом:

pythonfrom django.contrib.auth.models import User

users = User.objects.all()
for user in users:
  status = "staff" if user.is_staff else "regular"
  print(f"{user.username}: {status}")

Результат выполнения кода:

python"john: regular"
"admin: staff"
"alice: regular"

Пример . Проверка прав в представлении

Проверим, имеет ли текущий пользователь доступ к административной панели, используя атрибут is_staff:

pythonfrom django.contrib.auth.models import User
from django.http import HttpResponse

def check_admin_access(user_id):
  user = User.objects.get(id=user_id)
  if user.is_staff and user.is_active:
    return HttpResponse("Access granted to admin panel")
  return HttpResponse("Access denied")

Пример . Работа с декоратором

В Django существует встроенный декоратор staff_member_required, который проверяет атрибут is_staff и перенаправляет неавторизованных пользователей:

pythonfrom django.contrib.admin.views.decorators import staff_member_required
from django.http import HttpResponse

@staff_member_required
def admin_dashboard(request):
  return HttpResponse("Welcome to admin dashboard")

Смотрите также

  • атрибут is_superuser,
    который предоставляет все права без ограничений
  • атрибут is_active,
    который определяет активность учётной записи
  • атрибут is_authenticated,
    который проверяет, аутентифицирован ли пользователь
  • метод create_superuser,
    который создает суперпользователя со всеми правами