6

我正在编写一个继承自 ListView 的视图,并试图将视图限制为登录用户。

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-in-urlconf说在 URLconf 中使用 login_required 进行装饰“在每个实例的基础上应用装饰器。如果你想要要装饰的视图的每个实例,您都需要采用不同的方法”-该方法是在视图代码中装饰调度方法。

我以为我知道类和实例之间的区别,但是这句话对我没有任何意义。有人可以澄清一下吗?除了在 URLconf 中而不是在您的类定义中有一个装饰器之外,这两种方法之间有什么区别?

该链接上方的段落似乎回答了这个问题:“由于基于类的视图不是函数,因此根据您是使用 as_view 还是创建子类,装饰它们的工作方式会有所不同。”

真的??我似乎可以在我的 ListView 子类中使用 URLconf 方法。

4

1 回答 1

5

假设您有以下基于类的视图:

class PostListView(ListView):
     model = Post

ProtectedPostListView = login_required(PostListView.as_view())

和你的 urls.py:

url(r'posts$', ProtectedPostListView)

如果您使用这种方法,那么您将失去子类化的能力,ProtectedPostListView例如

class MyNewView(ProtectedPostListView):
    #IMPOSSIBLE

这是因为它.as_view()返回一个函数,并且在应用login_required装饰器之后,你留下了一个函数,所以子类化是不可能的。

另一方面,如果您采用第二种方法,即使用方法装饰器,则可以进行子类化。例如

class PostListView(ListView):
     model = Post

     @method_decorator(login_required)
     def dispatch(self, *args, **kwargs):
         return super(PostListView, self).dispatch(*args, **kwargs)

class MyNewView(PostListView):
     #LEGAL
于 2012-08-26T23:43:14.670 回答