ã¨ããããã㪠generic view ã® object_list ã®æ¡å¼µ
ååã®ç¶ããç¸å¤ãããæ å ±åéããµãã£ã¦ãã¦ããã¾ãããç¥ããªãã®ã§èªåã§ä½ãã¨ããããã¹ã¿ã¼ãããããã¬ã¼ã ã¯ã¼ã¯ã£ã¦ããã®ã¯ã調ã¹ãããèªåã§ä½ã£ãæ¹ãæ©ãã¨æããã¦ããããªãããã¨ãã£ã¦ããã§ä½ã£ã¡ãè² ãã ãã©ã
誰ã使ããªãã¨ã¯æããã©ãfilter ã¨ã inclusion_tag ã¨ã simple_tag ã§ã¯å®ç¾ã§ããªãè¤é㪠templatetags ã®ä½ãæ¹ã¨ãåèã«ãªãã¨ãããªã¨æã£ã¦æãã¦ã¿ãã
ã¡ãªã¿ã«ããã㯠admin ã®ãã³ãã¬ã¼ãã CSS ãæµç¨ãã¦æè»½ã«æ¸ããããã«ãããã®ãSVN ã® HEAD ã§ã¯ãã£ã¨æ¥½ã«ãªã£ã¦ãã®ããªãã
views.generic.py:
from django.http import HttpResponse from django.views.generic.list_detail import object_list as _object_list def object_list(request, queryset = None, *args, **kwargs): # queryset 㯠``Model.objects.all()`` ã¿ããã«ç´æ¥æå®ãã代ããã« # ``lambda req: Model.objects.all()`` ã®ããã«æå®ããã # è¤éãªäºããããã¨ãã㨠urlpatterns ãé·ããªãã®ãåé¡ã«ãªãããã ãã©ã qs = queryset(request) if request.GET.has_key('sort_by'): qs = qs.order_by(*request.GET.getlist('sort_by')) return _object_list(request, queryset = qs, *args, **kwargs)
templatetags/listutils.py:
from django.utils.html import escape from django.utils.translation import gettext from django.template import Library, Node, TemplateSyntaxError, TokenParser, resolve_variable register = Library() class SortableListHeaderTokenParser(TokenParser): def top(self): values = [] while True: values.append(self.value()) if not self.more(): break return values class SortableListHeaderNode(Node): class RenderHelper: def __init__(self, queryset): sorted_fields = {} # XXX: æ¬æ¥ã¯ _order_by ã¯ã®ããã¡ããã¡ã¨æããã if hasattr(queryset._order_by, '__iter__'): for spec in queryset._order_by: if spec[0] == '-': sorted_fields[spec[1:]] = -1 else: sorted_fields[spec] = 1 self._sorted_fields = sorted_fields self._queryset = queryset def render(self, name): field_verbose_name = gettext( self._queryset.model._meta.get_field(name).verbose_name) retval = '' spec = self._sorted_fields.get(name, None) if spec != None: retval += '<th class="sorted %s">' % ( spec > 0 and 'ascending' or 'descending', ) else: retval += '<th>' retval += '<a href="?sort_by=%s%s">%s</a>' % ( (self._sorted_fields.get(name, -1) > 0 and '-' or ''), name, escape(field_verbose_name), ) retval += '</th>' return retval def __init__(self, queryset, *fields): self.queryset = queryset self.fields = fields def render_header_column(self, queryset, name): return retval def render(self, context): queryset = resolve_variable(self.queryset, context) rdr = self.RenderHelper(queryset) return ''.join([ rdr.render(resolve_variable(field, context)) for field in self.fields ]) def sortable_list_header(parser, token): args = SortableListHeaderTokenParser(token.contents).top() return SortableListHeaderNode(*args) register.tag('sortable_list_header', sortable_list_header)
ãã³ãã¬ã¼ãã®ä¾ (admin ã®ãã³ãã¬ã¼ããæµç¨)
{% extends "main/base_site.html" %} {% load listutils i18n %} {% block content %}<div id="content-main"> {% block object-tools %} <ul class="object-tools"> <li><a href="+" class="addlink">{% trans 'Add a new project' %}</a></li> </ul> {% endblock %} <table> <thead> <tr> {% sortable_list_header object_list 'id' 'name' %} </tr> </thead> <tbody> {% for object in object_list %} <tr> <td><a href="{{ object.get_absolute_url }}">{{ object.id }}</a></td> <td><a href="{{ object.get_absolute_url }}">{{ object.name }}</a></td> </tr> {% endfor %} </tbody> </table> </div>{% endblock %}