跳到主要内容

Django 如何在CBV添加装饰器?

参考答案:

在 Django 中,如果你想在类视图(Class-Based Views, CBVs)上添加装饰器,你不能像在函数视图上那样直接添加。相反,你需要重写类视图的一些方法,并使用 method_decorator 装饰器来装饰这些方法。

以下是一个示例,演示如何在 Django 的 CBV 上添加装饰器:

from django.views import View
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required

@method_decorator(login_required, name='dispatch')
class MyView(View):
    def get(self, request, *args, **kwargs):
        # 处理 GET 请求的代码
        pass

    def post(self, request, *args, **kwargs):
        # 处理 POST 请求的代码
        pass

在上面的示例中,@method_decorator 装饰器被用于装饰 dispatch 方法。dispatch 方法是类视图中的核心方法,它负责根据请求的方法(如 GET、POST 等)调用相应的处理方法。通过装饰 dispatch 方法,我们可以确保所有请求都需要登录。

如果你想为特定的请求方法(如 GET 或 POST)添加装饰器,你可以直接装饰该方法,如下所示:

from django.views import View
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required

class MyView(View):
    @method_decorator(login_required)
    def get(self, request, *args, **kwargs):
        # 仅处理需要登录的 GET 请求的代码
        pass

    def post(self, request, *args, **kwargs):
        # 处理 POST 请求的代码,不需要登录
        pass

在这个示例中,只有 GET 请求需要登录,而 POST 请求则不需要。

注意:method_decoratorname 参数指定了要装饰的方法名。如果你不提供 name 参数,method_decorator 会默认装饰 __init__ 方法,这通常不是你想要的结果。