Кастомные миксины
Теперь давайте в нашей папке services, которую мы создали в 10.4 "Работа с DetailView, форматирование и обработка кириллицы в Slug" создадим файл mixins.py, и добавим следующий код:
from django.contrib.auth.mixins import AccessMixin
from django.contrib import messages
from django.shortcuts import redirect
class AuthorRequiredMixin(AccessMixin):
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return self.handle_no_permission()
if request.user.is_authenticated:
if (request.user != self.get_object().author) or not request.user.is_staff:
messages.info(request, 'Изменение статьи доступно только автору!')
return redirect('home')
return super().dispatch(request, *args, **kwargs)
В примере выше мы создали миксин наследуясь от основного AccessMixin и добавили возможность редактирования статьи только автору и администратору. Давайте воспользуемся нашим миксином в представлении обновления записей PostUpdateView:
from ..services.mixins import AuthorRequiredMixin
class PostUpdateView(AuthorRequiredMixin, SuccessMessageMixin, UpdateView):
"""
Представление: обновления материала на сайте
"""
model = Post
template_name = 'blog/post_update.html'
context_object_name = 'post'
form_class = PostUpdateForm
login_url = 'home'
success_message = 'Запись была успешно обновлена!'
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = f'Обновление статьи: {self.object.title}'
return context
def form_valid(self, form):
# form.instance.updater = self.request.user
form.save()
return super().form_valid(form)
В этом коде мы убрали LoginRequiredMixin, так как данная логика уже добавлена в кастомный миксин AuthorRequiredMixin. Осталось проверить на сайте, запустим сервер и попробуем обновить запись как гость:
Мы видим что нас переправило на главную страницу нашего блога. Теперь авторизуемся как администратор, и попробуем изменить записи:
Отлично, наши миксины работают, в следующих разделах мы добавим систему регистрации и авторизации для нашего блога.