带有login_required和permission_required的@method_decorator

时间:2015-04-16 11:37:30

标签: django django-templates django-views

我使用基于类的视图,我希望确保每个视图都可以由登录用户和一种类型的用户访问(有两组用户 - 每组有不同的权限)。

我是根据文档继续实现这一点(我使用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)

谢谢!

1 个答案:

答案 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):
        ...