Django Admin не поддерживает права доступа к объекту , в том смысле, что никогда не будет запрашивать разрешениечтобы выполнить действие с объектом, только если пользователю разрешено воздействовать на (любые) экземпляры модели.
Если вы хотите сообщить Django, есть ли у пользователя разрешения на конкретный объект, выпришлось бы переопределить следующие методы ModelAdmin модели:
has_view_permission(user, obj=None)
has_change_permission(user, obj=None)
has_delete_permission(user, obj=None)
правила поставляются с пользовательским подклассом ModelAdmin
, rules.contrib.admin.ObjectPermissionsModelAdmin
, который переопределяет эти методы для передачи отредактированного экземпляра модели авторизациибэкэнды, таким образом, включающие разрешения для каждого объекта в Admin:
# books/admin.py
from django.contrib import admin
from rules.contrib.admin import ObjectPermissionsModelAdmin
from .models import Book
class BookAdmin(ObjectPermissionsModelAdmin):
pass
admin.site.register(Book, BookAdmin)
Теперь это позволяет вам определять разрешения следующим образом:
rules.add_perm('books', rules.always_allow)
rules.add_perm('books.add_book', has_author_profile)
rules.add_perm('books.change_book', is_book_author_or_editor)
rules.add_perm('books.delete_book', is_book_author)
Чтобы сохранить обратную совместимость, Django запросит любое представлениеили изменить разрешение.Для максимальной гибкости правила ведут себя немного иначе: правила будут запрашивать разрешение на изменение, если и только если не существует правила для разрешения на просмотр.