2
2
Tagging related views.
3
3
"""
4
4
from django .http import Http404
5
+ from django .views .generic .list import ListView
5
6
from django .utils .translation import ugettext as _
6
- from django .views . generic . list_detail import object_list
7
+ from django .core . exceptions import ImproperlyConfigured
7
8
8
9
from tagging .models import Tag
9
10
from tagging .models import TaggedItem
10
11
from tagging .utils import get_tag
11
12
12
13
13
- def tagged_object_list (request , queryset_or_model = None , tag = None ,
14
- related_tags = False , related_tag_counts = True , ** kwargs ):
14
+ class TaggedObjectList (ListView ):
15
15
"""
16
16
A thin wrapper around
17
- ``django.views.generic.list_detail.object_list `` which creates a
17
+ ``django.views.generic.list.ListView `` which creates a
18
18
``QuerySet`` containing instances of the given queryset or model
19
19
tagged with the given tag.
20
20
@@ -28,30 +28,50 @@ def tagged_object_list(request, queryset_or_model=None, tag=None,
28
28
tag will have a ``count`` attribute indicating the number of items
29
29
which have it in addition to the given tag.
30
30
"""
31
- if queryset_or_model is None :
32
- try :
33
- queryset_or_model = kwargs .pop ('queryset_or_model' )
34
- except KeyError :
35
- raise AttributeError (
36
- _ ('tagged_object_list must be called '
37
- 'with a queryset or a model.' ))
38
-
39
- if tag is None :
40
- try :
41
- tag = kwargs .pop ('tag' )
42
- except KeyError :
43
- raise AttributeError (
44
- _ ('tagged_object_list must be called with a tag.' ))
45
-
46
- tag_instance = get_tag (tag )
47
- if tag_instance is None :
48
- raise Http404 (_ ('No Tag found matching "%s".' ) % tag )
49
- queryset = TaggedItem .objects .get_by_model (queryset_or_model , tag_instance )
50
- if 'extra_context' not in kwargs :
51
- kwargs ['extra_context' ] = {}
52
- kwargs ['extra_context' ]['tag' ] = tag_instance
53
- if related_tags :
54
- kwargs ['extra_context' ]['related_tags' ] = \
55
- Tag .objects .related_for_model (tag_instance , queryset_or_model ,
56
- counts = related_tag_counts )
57
- return object_list (request , queryset , ** kwargs )
31
+ tag = None
32
+ related_tags = False
33
+ related_tag_counts = True
34
+
35
+ def get_tag (self ):
36
+ if self .tag is None :
37
+ try :
38
+ self .tag = self .kwargs .pop ('tag' )
39
+ except KeyError :
40
+ raise AttributeError (
41
+ _ ('TaggedObjectList must be called with a tag.' ))
42
+
43
+ tag_instance = get_tag (self .tag )
44
+ if tag_instance is None :
45
+ raise Http404 (_ ('No Tag found matching "%s".' ) % self .tag )
46
+
47
+ return tag_instance
48
+
49
+ def get_queryset_or_model (self ):
50
+ if self .queryset is not None :
51
+ return self .queryset
52
+ elif self .model is not None :
53
+ return self .model
54
+ else :
55
+ raise ImproperlyConfigured (
56
+ "%(cls)s is missing a QuerySet. Define "
57
+ "%(cls)s.model, %(cls)s.queryset, or override "
58
+ "%(cls)s.get_queryset_or_model()." % {
59
+ 'cls' : self .__class__ .__name__
60
+ }
61
+ )
62
+
63
+ def get_queryset (self ):
64
+ self .queryset_or_model = self .get_queryset_or_model ()
65
+ self .tag_instance = self .get_tag ()
66
+ return TaggedItem .objects .get_by_model (
67
+ self .queryset_or_model , self .tag_instance )
68
+
69
+ def get_context_data (self , ** kwargs ):
70
+ context = super (TaggedObjectList , self ).get_context_data (** kwargs )
71
+ context ['tag' ] = self .tag_instance
72
+
73
+ if self .related_tags :
74
+ context ['related_tags' ] = Tag .objects .related_for_model (
75
+ self .tag_instance , self .queryset_or_model ,
76
+ counts = self .related_tag_counts )
77
+ return context
0 commit comments