Метод has_add_permission

Метод has_add_permission используется в классе ModelAdmin для проверки, может ли пользователь добавлять новые объекты данной модели через административный интерфейс. Метод принимает объект запроса и возвращает логическое значение True, если пользователь имеет право на добавление, и False в противном случае. По умолчанию метод возвращает значение, основанное на стандартных разрешениях Django, но его можно переопределить для реализации собственной логики проверки прав.

Синтаксис

pythonclass MyModelAdmin(admin.ModelAdmin):
  def has_add_permission(self, request, obj=None):
    # Логика проверки права на добавление
    return super().has_add_permission(request, obj)

Пример

Рассмотрим простой пример, где доступ к добавлению объектов разрешён только суперпользователям:

pythonfrom django.contrib import admin
from myapp.models import Article

class ArticleAdmin(admin.ModelAdmin):
  list_display = ('title', 'status', 'author')

  def has_add_permission(self, request, obj=None):
    if request.user.is_superuser:
      return True
    return False

admin.site.register(Article, ArticleAdmin)

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

pythonFalse

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

pythonTrue

Пример

В этом примере разрешим добавление только тем пользователям, которые входят в определённую группу:

pythonfrom django.contrib import admin
from myapp.models import Category

class CategoryAdmin(admin.ModelAdmin):
  list_display = ('name', 'created_at')

  def has_add_permission(self, request, obj=None):
    if request.user.groups.filter(name='Editors').exists():
      return True
    return super().has_add_permission(request, obj)

admin.site.register(Category, CategoryAdmin)

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

pythonTrue

Пример

Более сложная логика: запретим добавление, если количество уже созданных объектов превышает определённый лимит:

pythonfrom django.contrib import admin
from myapp.models import Article

class ArticleAdmin(admin.ModelAdmin):
  list_display = ('title', 'status', 'author')

  def has_add_permission(self, request, obj=None):
    # Разрешаем добавлять не более 100 статей
    if Article.objects.count() >= 100:
      return False
    return super().has_add_permission(request, obj)

admin.site.register(Article, ArticleAdmin)

Результат выполнения кода при количестве статей 100:

pythonFalse

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

  • метод has_change_permission,
    который проверяет право на изменение объектов
  • метод has_delete_permission,
    который проверяет право на удаление объектов
  • класс ModelAdmin,
    который управляет отображением модели в административной панели
  • декоратор admin.register,
    который регистрирует модель с её административным классом