Ваша декорированная функция не будет ничего возвращать (следовательно, None
), если request.user.role
как 'admin'
, но имеет .institute
с .device
, или роль не admin
, и она также не является 'employee'
.
Вам необходимо вернуть результат упакованной функции, если вы не выполняете перенаправление:
def has_permission_view():
def decorator(view_func):
def wrap(request, *args, **kwargs):
if request.user.role == 'admin':
if not hasattr(request.user, 'institute'):
messages.add_message(
request, messages.WARNING, "Please Add Your Institute Information")
return HttpResponseRedirect(reverse('accounts:add_institute'))
elif not hasattr(request.user.institute, 'device'):
messages.add_message(
request, messages.WARNING, "Please Add Your Attendance Device Information")
return HttpResponseRedirect(reverse('accounts:device'))
elif request.user.role == 'employee':
return HttpResponseRedirect(reverse('accounts:profile'))
<b>return view_func(request, *args, **kwargs)</b>
return wrap
return decorator
Сочетание HttpResponseRedirect
и reverse
является redirect(..)
[Django -док] . Таким образом, вы можете упростить ваш декоратор с помощью:
from django.shortcuts import redirect
def has_permission_view():
def decorator(view_func):
def wrap(request, *args, **kwargs):
if request.user.role == 'admin':
if not hasattr(request.user, 'institute'):
messages.add_message(
request, messages.WARNING, "Please Add Your Institute Information")
return <b>redirect(</b>'accounts:add_institute'<b>)</b>
elif not hasattr(request.user.institute, 'device'):
messages.add_message(
request, messages.WARNING, "Please Add Your Attendance Device Information")
return <b>redirect(</b>'accounts:device'<b>)</b>
elif request.user.role == 'employee':
return <b>redirect(</b>'accounts:profile'<b>)</b>
return view_func(request, *args, **kwargs)
return wrap
return decorator