我定义了几个网址:
url(r'^board/$', TemplateView.as_view(template_name='recruit/board.html'), name='recruit_board'),
url(r'^job/$', login_required(TemplateView.as_view(template_name='recruit/job_detail.html')), name='job_detail'),
url(r'^company/$', login_required(TemplateView.as_view(template_name='recruit/company_detail.html')), name='company_detail'),
...我设计的用户有两种帐户类型: A 或 B 。
“作业”网址只能由拥有 A 帐户类型的用户访问,而“公司”网址只能由 B 帐户类型用户查看。如果用户尝试访问错误的网址,则会将其重定向到“主板”网址。
我使用了 login_required 装饰器,我知道 user_passes_test ,但我不知道如何从这里开始。我可以编写一个像 login_required 一样的新装饰器并得到我想要的东西吗?
答案 0 :(得分:1)
我认为group_required decorator符合您的目的。
我假设您有三个组['admin', 'job', 'company']
,您可以像这样编写代码。由于group_required
已选中is_authenticated
,因此您不再需要login_required
。
from django.conf.urls import url
from django.views.generic import TemplateView
from django.contrib.auth.decorators import user_passes_test
def group_required(*group_names):
"""Requires user membership in at least one of the groups passed in."""
def in_groups(u):
if u.is_authenticated():
if bool(u.groups.filter(name__in=group_names)) | u.is_superuser:
return True
return False
return user_passes_test(in_groups)
url(r'^board/$', TemplateView.as_view(template_name='recruit/board.html'), name='recruit_board'),
url(r'^job/$', group_required(['admin', 'job'])(TemplateView.as_view(template_name='recruit/job_detail.html')), name='job_detail'),
url(r'^company/$', group_required(['admin', 'company'])(TemplateView.as_view(template_name='recruit/company_detail.html')), name='company_detail'),