From 1070cb7daeefe0bd367588003758d03fc0b5da17 Mon Sep 17 00:00:00 2001 From: Erik Simmler Date: Sun, 27 Mar 2011 00:23:42 +0800 Subject: [PATCH] Added a class based CategoryDetailView that should be functionally identical to the original function based view. --- categories/views.py | 48 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/categories/views.py b/categories/views.py index add192a..c037ade 100644 --- a/categories/views.py +++ b/categories/views.py @@ -1,6 +1,6 @@ from django.shortcuts import get_object_or_404 from django.template import RequestContext -from django.http import HttpResponse +from django.http import HttpResponse, Http404 from django.views.decorators.cache import cache_page from django.template.loader import select_template from categories.models import Category @@ -30,4 +30,48 @@ def category_detail(request, path, context.update({'category':category}) if extra_context: context.update(extra_context) - return HttpResponse(select_template(templates).render(context)) \ No newline at end of file + return HttpResponse(select_template(templates).render(context)) + + +import django +if django.VERSION[0] >= 1 and django.VERSION[1] >= 3: + from django.views.generic import DetailView + + class CategoryDetailView(DetailView): + + model = Category + path_field = 'path' + + def get_object(self, **kwargs): + if self.path_field not in self.kwargs: + raise AttributeError(u"Category detail view %s must be called with " + u"a %s." % self.__class__.__name__, self.path_field) + if self.queryset is None: + queryset = self.get_queryset() + + self.path_items = self.kwargs[self.path_field].strip('/').split('/') + if len(self.path_items) >= 2: + queryset = queryset.filter( + slug__iexact = self.path_items[-1], + level = len(self.path_items)-1, + parent__slug__iexact=self.path_items[-2]) + else: + queryset = queryset.filter( + slug__iexact = self.path_items[-1], + level = len(self.path_items)-1) + + try: + obj = queryset.get() + except ObjectDoesNotExist: + raise Http404(_(u"No %(verbose_name)s found matching the query") % + {'verbose_name': queryset.model._meta.verbose_name}) + return obj + + def get_template_names(self): + names = [] + path_items = self.path_items + while path_items: + names.append('categories/%s.html' % '_'.join(path_items)) + path_items.pop() + names.extend(super(CategoryDetailView, self).get_template_names()) + return names \ No newline at end of file