假设我有视图
def foo(request)
我也使用自定义用户模型如下:
class MyUser(AbstractUser):
field = models.BooleanField()
我想组合2个django装饰器:login_required和user_passed_test,以便匿名用户应该重定向到登录页面,不允许看到视图的用户(user.field == False)应该看到一个正确的消息(比如说'你不允许看到这个')。
所以我试过了:
my_decor = user_passes_test(lambda user: user.field == True,
login_url='/bar')
def custom_decor(view_func):
decorated_view_func = login_required(my_decor(view_func), login_url='/login')
return decorated_view_func
我还必须定义视图:
def bar(request):
return HttpResponse('you are not allowed to see this context.')
并在我的网址中对其进行硬编码。
问题是:我可以在不创建其他视图并将其添加到网址的情况下执行此操作吗?有没有办法让'user_passed_test'装饰器引发404错误而不是重定向到登录视图?
可能有一个非常简单的解决方案,当然我只是错过了它。
答案 0 :(得分:0)
我不太清楚装饰器语法,但你可以这样做:
def custom_decor(view_func):
def decorator(request, *args, **kwargs)
if request.user.field is True:
return view_func(request, *arg, **kwargs)
raise Http404
return decorator
所以...
@login_required(login_url='/login')
@custom_decor
def foo(request)
# ...