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_decorator
的 name
参数指定了要装饰的方法名。如果你不提供 name
参数,method_decorator
会默认装饰 __init__
方法,这通常不是你想要的结果。