Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django视图-用户通过多个条件的测试?_Django - Fatal编程技术网

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