Метод has_add_permission
Метод has_add_permission используется в классе ModelAdmin для проверки, может ли пользователь добавлять новые объекты данной модели через административный интерфейс. Метод принимает объект запроса и возвращает логическое значение True, если пользователь имеет право на добавление, и False в противном случае. По умолчанию метод возвращает значение, основанное на стандартных разрешениях Django, но его можно переопределить для реализации собственной логики проверки прав.
Синтаксис
class MyModelAdmin(admin.ModelAdmin):
def has_add_permission(self, request, obj=None):
# Логика проверки права на добавление
return super().has_add_permission(request, obj)
Пример
Рассмотрим простой пример, где доступ к добавлению объектов разрешён только суперпользователям:
from 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)
Результат проверки для обычного пользователя:
False
Результат проверки для суперпользователя:
True
Пример
В этом примере разрешим добавление только тем пользователям, которые входят в определённую группу:
from 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':
True
Пример
Более сложная логика: запретим добавление, если количество уже созданных объектов превышает определённый лимит:
from 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:
False
Смотрите также
-
метод
has_change_permission,
который проверяет право на изменение объектов -
метод
has_delete_permission,
который проверяет право на удаление объектов -
класс
ModelAdmin,
который управляет отображением модели в административной панели -
декоратор
admin.register,
который регистрирует модель с её административным классом