django视图-用户通过多个条件的测试?
在允许用户运行视图之前,我使用下面的命令来确保用户具有自定义权限。但是,我想添加多个条件,即用户拥有永久站点。可以查看管理或站点。可以查看财务django视图-用户通过多个条件的测试?,django,Django,在允许用户运行视图之前,我使用下面的命令来确保用户具有自定义权限。但是,我想添加多个条件,即用户拥有永久站点。可以查看管理或站点。可以查看财务 @user_passes_test(lambda u: u.has_perm('sites.can_view_mgmt')) 是否可能有一个或在用户通过测试 谢谢您要做的是编写一个函数,将其传递给@user\u passes\u test,其中包括所有检查 大概是这样的: def user_test(user): try:
@user_passes_test(lambda u: u.has_perm('sites.can_view_mgmt'))
是否可能有一个或在用户通过测试
谢谢您要做的是编写一个函数,将其传递给
@user\u passes\u test
,其中包括所有检查
大概是这样的:
def user_test(user):
try:
assert user.has_perm
assert user.next_test
except AssertionError:
return False
return True
依此类推,直到你发现一个测试打破它或你没有,用户通过。然后,你只要通过user\u测试
就可以了
@user\u通过测试(user\u测试)
或逻辑
如果必须满足至少一个条件,则可以在lambda表达式中使用或
:
@user_passes_test(lambda u: u.has_perm('sites.can_view_mgmt') or u.has_perm('sites.can_view_mgmt'))
def some_view(request):
# ...
pass
与逻辑
如果必须满足所有条件,可以使用和
而不是或
。但是,Django还有一个功能,可以检查是否所有权限都有效,因此:
@user_passes_test(lambda u: u.has_perms(['sites.can_view_mgmt', 'sites.can_view_mgmt']))
def some_view(request):
# ...
pass
对于正确的方式和其他自定义权限检查,请按照上面所述的@rchurch4执行。 但修改如下:
def user_test(user):
if user.has_perm:
return True
else:
redirect(<login_page>) OR
redirect(<custom_error_page>)
而不仅仅是把它放在视野中:
@manangement_required
def view_home(request):
pass
谢谢,这就是我需要的。这是直截了当的,很容易理解。谢谢。但是这不会在
user\u test
中引起错误吗。如果我理解正确,测试应该返回True
或False
。关键是它应该引发错误。很抱歉,我的伪代码并不完美,实际上您应该断言并捕获异常。如果捕获到异常,则返回False
,否则返回True
def user_test(user):
if user.has_perm:
return True
else:
redirect(<login_page>) OR
redirect(<custom_error_page>)
def management_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME,
login_url='home:home'):
actual_decorator = user_passes_test(
lambda u: u.user_role == 2,
login_url=login_url,
redirect_field_name=redirect_field_name
)
if function:
return actual_decorator(function)
return actual_decorator
@manangement_required
def view_home(request):
pass