Django 基于类的通用视图和身份验证
Posted
技术标签:
【中文标题】Django 基于类的通用视图和身份验证【英文标题】:Django Class-Based Generic Views and Authentication 【发布时间】:2011-10-01 13:08:00 【问题描述】:我对 Django 很陌生(从 1.3 开始)。在构建应用程序时,我从第一天开始就使用新的基于类的通用视图,使用内置类的组合并在需要添加到上下文的地方对它们进行子类化。
现在我的问题是,我需要返回我的视图,并且只有登录用户才能访问它们。我找到的所有文档都显示了如何使用旧的功能通用视图执行此操作,而不是基于类的视图。
这是一个示例类:
class ListDetailView(DetailView):
context_object_name = "list"
def get_queryset(self):
list = get_object_or_404(List, id__iexact=self.kwargs['pk'])
return List.objects.all()
def get_context_data(self, **kwargs):
context = super(ListDetailView, self).get_context_data(**kwargs)
context['subscriber_list'] = Subscriber.objects.filter(lists=self.kwargs['pk'])
return context
如何向 django 的新的基于类的视图添加身份验证?
【问题讨论】:
How to use permission_required decorators on django class-based views 的可能重复项 【参考方案1】:还有一个身份验证混合选项,您可以从中派生视图类。所以使用this mixin from brack3t.com:
class LoginRequiredMixin(object):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(LoginRequiredMixin, self).dispatch(*args, **kwargs)
然后您可以像这样创建新的“需要身份验证”视图:
from django.views.generic import DetailView
class MyDetailView(LoginRequiredMixin, DetailView):
....
无需其他添加。感觉很像不重复自己。
【讨论】:
不错!我更喜欢这种方法。【参考方案2】:decorating class-based views 上的文档中有一个部分 - 如果您只想使用旧的 login_required
等,那就是要走的路。
【讨论】:
我喜欢使用同一个链接中描述的调度方法,只是为了保持 urlconf 更干净。另一种方法是使用 dispatch 方法子类化 DetailView 并调用它 RestrictedDetailView 然后在其他地方子类化 RestrictedDetailView 请注意,上面的链接已更改。立即查看docs.djangoproject.com/en/dev/topics/class-based-views/intro/…【参考方案3】:我正在描述一种装饰任何 ListView 的方法:
class MyListView(ListView):
decorator = lambda x: x
@method_decorator(decorator)
def dispatch(self, request, *args, **kwargs):
return super(MyListView, self).dispatch(request, *args, **kwargs)
在编写了这样一个基于类的视图之后, 您可以直接将任何基于函数的装饰器插入到 url 中。
url(r'^myurl/$', MyListView.as_view(decorator=login_required))
【讨论】:
以上是关于Django 基于类的通用视图和身份验证的主要内容,如果未能解决你的问题,请参考以下文章