Link Search Menu Expand Document

Миксины

Миксины необходимы чтобы выность в них общую логику которую мы сможем использовать затем в общих классах

Миксины создаются в файле /mysite/news/utils.py

class MyMixin(object):
    mixin_prop = ''
    def get_prop(self):
        return self.mixin_prop.upper()

Затем в файле views.py подключим ‘utils.py’

from .utils import MyMixin

и сделаем чтобы необходимые классы наследовали наш новый класс MyMixin:

class HomeNews(MyMixin, ListView):

и

class NewsByCategory(MyMixin, ListView):

Затем в классе HomeNews добавим параметр:

mixin_prop = 'Hello, World!'

А также в функцию get_context_data добавим новую переменную контекста:

context['mixin_prop'] = self.get_prop()

Тем самым мы сделаем переменную mixin_prop доступной в шаблоне.

Ограничение доступа на страницы только для авторизованных пользователей

Подробнее про систему аутентификации

Миксины возможно применять только для классов-контроллеров. Для функций-контроллеров используется специальный декоратор @login_required

Для того, чтобы убрать какой-либо элемент из шаблона для неавторизированных пользователей необходимо использовать параметр request.user.is_authenticated:

{% if request.user.is_authenticated %}
<li class="nav-item"><a class="nav-link" href="{% url 'add_news' %}">Добавить новость</a></li>
{% endif %}

Но данная ссылка все равно будет доступна для любого пользователя перешедшего по ней напрямую. Чтобы это исправить, необходимо:

Импортируем мпециальный миксин в файле views.py

from django.contrib.auth.mixins import LoginRequiredMixin

Затем добавляем данный класс LoginRequiredMixin в наш класс выввода который нужно закрыть для неавторизованных пользователей:

class CreateNews(LoginRequiredMixin, CreateView):

Причем очень важно чтобы данный класс наследовался первым в списке наследуемых.

Класс LoginRequiredMixin может делать с неавторизованным пользователем две вещи:

  1. Перенаправлять на страницу авторизации login_url = '/admin/'
  2. Передавать 403 ошибку raise_exception = True