Ответ
PermissionRequiredMixin — это стандартный миксин в Django, который позволяет ограничить доступ к class-based views (CBV) на основе прав (permissions) пользователя.
Если у пользователя, обращающегося к view, нет требуемых прав, миксин либо перенаправляет его на страницу входа (если он не аутентифицирован), либо возвращает ошибку 403 Forbidden.
Как это работает:
Миксин должен быть указан в списке наследования перед основным классом представления (например, ListView).
Пример использования:
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.views.generic import ListView
from .models import Article
class ArticleListView(PermissionRequiredMixin, ListView):
# Требуемое право в формате 'app_label.codename'
# Например, 'news.view_article'
permission_required = 'news.view_article'
# Если True, при отказе в доступе будет вызвано исключение PermissionDenied (403)
# Если False (по умолчанию), анонимный пользователь будет перенаправлен на LOGIN_URL
raise_exception = True
model = Article
template_name = 'news/article_list.html'
Важные атрибуты:
permission_required: Строка с одним правом или кортеж/список строк для нескольких прав. В последнем случае пользователь должен обладать всеми указанными правами.login_url: URL для перенаправления, если пользователь не аутентифицирован.raise_exception: Определяет поведение при отказе в доступе для аутентифицированного пользователя.
Ответ 18+ 🔞
Ага, смотри-ка, опять эти ваши миксины. Ну, PermissionRequiredMixin, блядь — это такая штука в Django, которая стоит на страже, как злой батя у подъезда. Не пустит твое view нахуй, если у тебя нет нужной бумажки, то есть прав.
Короче, если юзер приперся без нужного пермишена, миксин либо пинком под жопу отправит его на страницу логина (если он вообще не залогинен), либо просто врежет ему в ебало ошибкой 403 Forbidden. Жестко, но справедливо.
Как этим пользоваться, чтобы не обосраться:
Главное правило — впихни этот миксин в наследование ПЕРВЫМ, прямо перед самим view-классом. Иначе он нихуя не сработает, как надо.
Вот, смотри, пример, чтобы было понятно:
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.views.generic import ListView
from .models import Article
class ArticleListView(PermissionRequiredMixin, ListView):
# Вот тут пишешь, какое право нужно. Формат: 'приложение.код_права'
# Например, 'новости.смотреть_статью' (ну, 'news.view_article' по-ихнему)
permission_required = 'news.view_article'
# А это — важный переключатель, ёпта!
# Если стоит True, то залогиненному, но бесправному юзеру прилетит 403-я ошибка (PermissionDenied).
# Если False (по дефолту так), то его просто вышлют нахуй на страницу входа.
raise_exception = True
model = Article
template_name = 'news/article_list.html'
На что ещё глаз положить:
permission_required: Можно одну строку с правом, а можно и целый список или кортеж накидать. Но учти — если прав несколько, юзеру нужно иметь ВСЕ из них, как патроны в обойме. Хоть одного не хватит — пиздец, доступ закрыт.login_url: Сюда пишешь адрес, куда посылать неаутентифицированных гостей. Если не указать, Django сам знает, куда.raise_exception: Вот эта хуйня решает судьбу.True— получи по ебалу исключением.False— иди, браток, авторизуйся сначала. Выбирай, как тебе удобнее пользователей ебать.