Управление доступом к странице в 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
)
...