Управление доступом к странице в UpdateView

Здравствуйте!!!
Я хочу контролировать, чтобы только суперпользователь и, например, учитель, могли получить доступ к странице, унаследованной от UpdateView и перенаправлять других на страницу /404.

Мой класс в views.py :

class Edit_news(UpdateView):
    model = News
    form_class = edit_NewsForm
    template_name = "profile/Edit_news.html"

URL класса в urls.py :

from django.urls import path
from .views import Edit_news

urlpatterns = [
    path("edit-news/<pk>", Edit_news.as_view()),
]

Спасибо за помощь...

Решение 1

Вы можете переопределить View.dispatch(), который является точкой входа любых HTTP методов для первой проверки пользователя.

dispatch(request, *args, **kwargs)

Часть представления - метод, который принимает аргумент запроса плюс аргументы и возвращает HTTP-ответ.

.

Реализация по умолчанию будет проверять метод HTTP и пытаться делегировать метод, соответствующий методу HTTP; GET будет делегирован на get(), POST на post(), и так далее.

class Edit_news(UpdateView):
    ...

    def dispatch(self, request, *args, **kwargs):
        if (
            request.user.is_superuser
            or request.user.has_perm('app.change_news')  # If ever you attach permissions to your users
            or request.user.email.endswith('@teachers.edu.org')  # If the email of teachers are identified by that suffix
            or custom_check_user(request.user)  # If you have a custom checker
        ):
            return super().dispatch(request, *args, **kwargs)
        return HttpResponseForbidden()

    ...

Если вы хотите, чтобы он был разным для HTTP GET, HTTP POST и других, то переопределите вместо этого конкретный метод.

class django.views.generic.edit.BaseUpdateView

Методы

get(request, *args, **kwargs)

post(request, *args, **kwargs)

Ссылка:

Решение 2

Вы также можете попробовать UserPassesTestMixin (реализация user_passes_test на основе класса).

class Edit_news(UserPassesTestMixin, UpdateView):  # Some mixins in django-auth is required to be in the leftmost position (though for this mixin, it isn't explicitly stated so probably it is fine if not).
    raise_exception = True  # To not redirect to the login url and just return 403. For the other settings, see https://docs.djangoproject.com/en/3.2/topics/auth/default/#django.contrib.auth.mixins.AccessMixin

    def test_func(self):
        return (
            self.request.user.is_superuser
            or self.request.user.has_perm('app.change_news')  # If ever you attach permissions to your users
            or self.request.user.email.endswith('@teachers.edu.org')  # If the email of teachers are identified by that suffix
            or custom_check_user(self.request.user)  # If you have a custom checker
        )

    ...
Вернуться на верх