Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

5.1 Разрешения на уровне пользователя
3 из 3 шагов пройдено

В предыдущем шаге мы рассматривали разрешения, которые предоставляются из фреймворка Django. Они входят в пакет django.contrib.auth.
Рассмотрели какие 4 разрешения Django создает для каждой модели по умолчанию.
Рассмотрели как эти разрешения можно задавать определенным пользователям и назначать эти разрешения группам.
Рассмотрели как можно в модели определять другие специфические разрешения и как их создавать программно.

Но все эти разрешения на уровне модели. Что это значит? 

Допустим, когда мы создаем модель Post, то Django наряду с другими разрешениями по умолчанию создает разрешение change_post.

И допустим, у нас есть пользователь Василий и мы ему задаем разрешение change_post. И теперь он может изменять все статьи, так как у него есть такое разрешение.

А что если мы хотим дать разрешение на редактирование только определенным статьям (объектам модели Post)?
Допустим есть четыре поста(объекта) и мы хотим дать Василию разрешение на редактирование первой и третьей статьи, а остальные статьи он не может редактировать:


Вот для решения таких задач(управление разрешениями на уровне объектов) мы и будем использовать библиотеку django-guardian.

Продолжим работу в нашем проекте и приложении blog. И установим библиотеку django-guardian:

pip install django-guardian


Подключим django_guardian в наш проект в файле settings.py. Также в этом файле добавим бэкенды для авторизации, которые используются для работы django_guardian:

INSTALLED_APPS = (
 #другие приложения
 'blog',
 'guardian',
)

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', # Этот бэкенд Django использует по умолчанию
    'guardian.backends.ObjectPermissionBackend', # А это  бэкенд django_guardian
)


После применения миграций, мы в базе данных увидим две таблицы, которые создал пакет django_guardian:


Теперь мы можем задавать разрешения либо программно, либо через административную панель Django. Давайте реализуем это через административную панель Django и покажем как каждому посту можно указать пользователя , который может редактировать этот пост. 

В файле admin.py напишем такой код:

from django.contrib import admin
from blog.models import Post
from guardian.admin import GuardedModelAdmin


class PostAdmin(GuardedModelAdmin):
    list_display = ('name',)


admin.site.register(Post, PostAdmin)


Добавляем первый пост и для пользователя  мы разрешим его редактирование:


Далее нажимаем в правом верхнем углу кнопку OBJECT PERMISSIONS, затем выбираем пользователя Василий и нажимаем кнопку Manage user:


Как вы видите, для пользователя Василий для объекта первый пост мы задали разрешение Can change post:


Это всё можно сделать и программно. Давайте добавим вторую статью и для пользователя Василия укажем, разрешение change_post:

from django.contrib.auth.models import User
from guardian.models import UserObjectPermission
from blog.models import Post

vasiliy = User.objects.get(username='Василий')
second_post = Post.objects.create(name='Второй пост', content='Этот пост может менять Василий')
UserObjectPermission.objects.assign_perm('change_post', vasiliy, obj=second_post)


Проверим работу:


В данном шаге я постарался показать как можно задавать разрешения отдельным объектам и управлять ими через административную панель или программным способом. С помощью замечательной библиотеки django-guardian это все реализуется очень легко.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.