登录django后在视图中使用自定义权限

时间:2017-04-04 13:49:16

标签: django permissions

我的models.py

中有3种类型的用户
class Customer(models.model)
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=‘Customer’)

class ClientTypeA(models.model)
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=‘ClientA’)

class ClientTypeB(models.model)
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=‘ClientB’)

我在我的基本模板中使用权限来呈现相关的侧边栏,但现在我还为每个用户和侧边栏合并了一个特定的仪表板,因此我发现为每个用户创建主页视图会更简单类型。

一旦我在其中记录用户,将其重定向到我的主视图 - 所以我在views.py

中提出了这个问题。
def home(request):

    if request.user.is_customer:
        return redirect(customer_home)

    elif request.user.is_clientA:
        return redirect(clientA_home)

    elif request.user.is_clientB:
        return redirect(clientB_home)

    else:
        return render(request, 'home.html')

调用的重定向只会将它们带到相应的主页。

  1. 我知道我的is_customer,is_clientA,is_clientB不会自动附带django,我如何以及在何处添加这些自定义权限?到我的models.py?为了简单地检查,我将它们设置为等于用户的活动类型?我是否甚至需要自定义权限,或者是否有更简单的方法来调用用户类型?

  2. 我是否使用过很多if语句? (我试图保持简单快速)

1 个答案:

答案 0 :(得分:1)

由于所有模型都具有User模型的一对一字段,因此您可以使用has_attr检查用户是否有该模型的行。您不必创建权限。

if hasattr(request.user, 'customer'):
    return redirect('customer_home')

如果您只有三种客户类型,则if / elif / else可能没问题。随着数量的增加,您可以将其更改为以下内容。

customer_types = [
    ('customer', 'customer_home'),
    ('clienttypea', 'ClientA_home'),
    ...
]

for field_name, redirect_url in customer_types:
    if hasattr(request.user, field_name):
        return redirect(redirect_url)
# fallback
return render(request, 'home.html')