Миксины
Миксины необходимы чтобы выность в них общую логику которую мы сможем использовать затем в общих классах
Миксины создаются в файле /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
может делать с неавторизованным пользователем две вещи:
- Перенаправлять на страницу авторизации
login_url = '/admin/'
- Передавать 403 ошибку
raise_exception = True