Декоратор - это функция, которая принимает в качестве входных данных функцию (или класс) для декорирования и вносит в нее некоторые изменения. Я бы go выбрал вариант с двумя методами, в котором, если первый метод является истинным, тогда он настоящий учитель, в противном случае это не так, и в таком случае он дает правильный результат.
def teacher_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='login'):
'''
Decorator for views that checks that the logged in user is a teacher,
redirects to the log-in page if necessary.
'''
actual_decorator = user_passes_test(
lambda u: u.is_active and u.is_teacher,
login_url=login_url,
redirect_field_name=redirect_field_name
)
Мы можем просто использовать случай для декоратора user_passes_test
from django.contrib.auth.decorators import user_passes_test
def teacher_required(function=None):
def is_teacher(u):
return Shopkeeper.objects.filter(user=u).exists()
actual_decorator = user_passes_test(is_teacher)
if function:
return actual_decorator(function)
else:
return actual_decorator
Вы можете, например, реализовать его как:
@login_required
@teacher_required
def teacher_view(request):
# ...
pass
@login_required
def not_teacher_view(request):
# ...
pass
Надеюсь, вы поняли идею, для ясности смотрите это