我使用基于类的视图,我希望确保每个视图都可以由登录用户和一种类型的用户访问(有两组用户 - 每组有不同的权限)。
我是根据文档继续实现这一点(我使用Django 1.7.7)https://docs.djangoproject.com/en/1.7/topics/class-based-views/intro/#decorating-the-class,但是使用两个参数会引发错误" method_decorator()只需1个参数(2个给定)" 。
因此 - 如何在基于类的视图中验证这两个因素(登录和权限)?
class PatientCreate(CreateView):
model = Patient
fields = '__all__'
@method_decorator(login_required, permission_required('patient.session.can_add_patient'))
def dispatch(self, *args, **kwargs):
return super(PatientCreate, self).dispatch(*args, **kwargs)
谢谢!
答案 0 :(得分:11)
在您的情况下,permission_required
将重定向到未登录用户的登录页面,因此您根本不需要使用login_required
。
@method_decorator(permission_required('patient.session.can_add_patient')
def dispatch(self, *args, **kwargs):
...
如果你真的需要使用多个装饰器,那么你可以在Django 1.9 +中使用一个列表
decorators = [other_decorator, permission_required('patient.session.can_add_patient')]
class PatientCreate(CreateView):
model = Patient
fields = '__all__'
@method_decorator(decorators)
def dispatch(self, *args, **kwargs):
...
您还可以通过修饰类本身来缩短代码:
@method_decorator(decorators, name="dispatch")
class PatientCreate(CreateView):
model = Patient
fields = '__all__'
在Django 1.8及更早版本中,您无法将列表传递给method_decorator
或装饰该类,因此您必须堆叠装饰器
class PatientCreate(CreateView):
model = Patient
fields = '__all__'
@method_decorator(other_decorator)
@method_decorator(permission_required('patient.session.can_add_patient'))
def dispatch(self, *args, **kwargs):
...