我想让Django的@login_required
装饰器测试User上的特定字段是否已设置为None以外的其他字段。 (添加的字段为null = true,默认值为None。)
新创建的User对象确实对该字段的值为None,但对@login_required
的明显更改在行为上没有明显区别(我重新启动了Gunicorn以确保新读取)。如果用户经过身份验证,则会呈现@login_required
个视图,即使添加的字段为“无”。
目前略有变化的@login_required
是:
def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME):
"""
Decorator for views that checks that the user is logged in, redirecting
to the log-in page if necessary.
"""
actual_decorator = user_passes_test(
lambda u: u.foo != None,
redirect_field_name=redirect_field_name
)
if function:
return actual_decorator(function)
return actual_decorator
原始的lambda在u.is_authenticated()
。
答案 0 :(得分:2)
我从您的代码中看到,您实际遇到了user_passes_test,这实际上是您应该使用的,而不是直接修改login_required的源代码。
user_passes_test()接受一个必需的参数:一个带有a的callable 用户对象,如果允许用户查看页面,则返回True。 请注意,user_passes_test()不会自动检查 用户不是匿名的。
您只需创建一个确保满足条件的功能。这样可以确保所有内容都保留在代码库中(对django的更新不会破坏您的应用程序)并使调试变得更加容易。
您的测试功能可能是。
def is_foo(user):
if user.is_authenticated() and user.foo :
return True