Существует модель Project
с отношением ManyToMany к модели User
, использующая таблицу соединений. Если пользователь не является участником проекта (не входит в таблицу соединений), я хочу запретить пользователю доступ к представлению, которое показывает конкретный проект.
Я знаю, что это можно решить с помощью простого оператора if внутри метода представления или пользовательского фильтра в шаблоне, но я хотел бы иметь возможность сделать это с помощью специального декоратора. Это возможно? Если да, то как это можно сделать?
Что-то типа:
def may_user_view_this(function):
def wrapper(request, *args, **kwargs):
user = request.user
project = Project.objects.get(id=???????) #id
if not project.has_user(user):
return HttpResponse('You cannot view this.')
else:
return function(request, *args, **kwargs)
return wrapper
@may_user_view_this() # if not go the specific url
def my_view(request, page_id=None):
# do stuff and render
Как я могу получить доступ к параметру page_id
, отправленному my_view
из функции декоратора?