2011-02-08 14 views
1

テーブル内のDjango要素の列をソートするにはどうすればよいですか?テーブル内のDjango要素の列をソートするにはどうすればよいですか?

私はDjango Adminがこれに気付いています。どうやって?

私がこれを読むことができるウェブリソースはありますか?

*「Djangoの要素は、」私はこのようになり、プラグイン可能なテンプレートオブジェクトを参照することでよ:

{{ x.y }} 

答えて

1

クエリからそれを取得している場合は、ビューでorder_by()メソッドを使用します。リストの場合は、ビュー内でsort()メソッドを使用します。

+0

ありがとうございました。私が探していたものです。これは別の質問です。ビジュアルの場合、管理者はヘッダーをシェーディングし、asc/desc、矢印を追加します。これはビューまたはHTML/Jqueryで行われますか? – pythondjango

+0

これはテンプレートとビューで行われます。 –

3

Djangoの管理者でチェンジビューのソースコードを見てみたワース:

http://code.djangoproject.com/svn/django/branches/releases/1.2.X/django/contrib/admin/views/main.py

注文プロセスは、おおよそ次のとおりです。

  1. あなたが管理者で列ヘッダをクリックしてください、これは、要求に応じて利用可能なURL内の関連する注文パラメータでページをリロードする.GET

  2. この注文パラメータは、チェンジ・ビューに解析される:

    self.order_field、self.order_type = self.get_orderingを()

  3. クエリセットが生成される:

    self.query_set = self.get_query_set() 特に、 (self.order_type == 'desc'と ' - 'または '')、self.order_field)を使用すると、次のような行が表示されます: if self.order_field: qs = qs.order_by( '%s%s' )

ソースコードを理解しながらdjango管理者を使用することは、私の意見では、djangoを学ぶ最良の方法の1つです!

0

管理者がDjango 0.96で何をやったかを見てから、このユーティリティクラスを作成しました。

GETパラメータに基づいてorder_by基準の作成を処理し、現在の並べ替えフィールドと方向を考慮したテーブルヘッダーソートリンクの生成に使用するコンテキスト変数を提供し、同じヘッダーが再度ソートされたときに方向を反転します。

ORDER_VAR = 'o' 
ORDER_TYPE_VAR = 'ot' 

class SortHeaders: 
    """ 
    Handles generation of an argument for the Django ORM's 
    ``order_by`` method and generation of table headers which reflect 
    the currently selected sort, based on defined table headers with 
    matching sort criteria. 

    Based in part on the Django Admin application's ``ChangeList`` 
    functionality. 
    """ 
    def __init__(self, request, headers, default_order_field=None, 
      default_order_type='asc', additional_params=None): 
     """ 
     request 
      The request currently being processed - the current sort 
      order field and type are determined based on GET 
      parameters. 

     headers 
      A list of two-tuples of header text and matching ordering 
      criteria for use with the Django ORM's ``order_by`` 
      method. A criterion of ``None`` indicates that a header 
      is not sortable. 

     default_order_field 
      The index of the header definition to be used for default 
      ordering and when an invalid or non-sortable header is 
      specified in GET parameters. If not specified, the index 
      of the first sortable header will be used. 

     default_order_type 
      The default type of ordering used - must be one of 
      ``'asc`` or ``'desc'``. 

     additional_params: 
      Query parameters which should always appear in sort links, 
      specified as a dictionary mapping parameter names to 
      values. For example, this might contain the current page 
      number if you're sorting a paginated list of items. 
     """ 
     if default_order_field is None: 
      for i, (header, query_lookup) in enumerate(headers): 
       if query_lookup is not None: 
        default_order_field = i 
        break 
     if default_order_field is None: 
      raise AttributeError('No default_order_field was specified and none of the header definitions given were sortable.') 
     if default_order_type not in ('asc', 'desc'): 
      raise AttributeError('If given, default_order_type must be one of \'asc\' or \'desc\'.') 
     if additional_params is None: additional_params = {} 

     self.header_defs = headers 
     self.additional_params = additional_params 
     self.order_field, self.order_type = default_order_field, default_order_type 

     # Determine order field and order type for the current request 
     params = dict(request.GET.items()) 
     if ORDER_VAR in params: 
      try: 
       new_order_field = int(params[ORDER_VAR]) 
       if headers[new_order_field][1] is not None: 
        self.order_field = new_order_field 
      except (IndexError, ValueError): 
       pass # Use the default 
     if ORDER_TYPE_VAR in params and params[ORDER_TYPE_VAR] in ('asc', 'desc'): 
      self.order_type = params[ORDER_TYPE_VAR] 

    def headers(self): 
     """ 
     Generates dicts containing header and sort link details for 
     all defined headers. 
     """ 
     for i, (header, order_criterion) in enumerate(self.header_defs): 
      th_classes = [] 
      new_order_type = 'asc' 
      if i == self.order_field: 
       th_classes.append('sorted %sending' % self.order_type) 
       new_order_type = {'asc': 'desc', 'desc': 'asc'}[self.order_type] 
      yield { 
       'text': header, 
       'sortable': order_criterion is not None, 
       'url': self.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}), 
       'class_attr': (th_classes and ' class="%s"' % ' '.join(th_classes) or ''), 
      } 

    def get_query_string(self, params): 
     """ 
     Creates a query string from the given dictionary of 
     parameters, including any additonal parameters which should 
     always be present. 
     """ 
     params.update(self.additional_params) 
     return '?%s' % '&'.join(['%s=%s' % (param, value) \ 
            for param, value in params.items()]) 

    def get_order_by(self): 
     """ 
     Creates an ordering criterion based on the current order 
     field and order type, for use with the Django ORM's 
     ``order_by`` method. 
     """ 
     return '%s%s' % (
      self.order_type == 'desc' and '-' or '', 
      self.header_defs[self.order_field][1], 
     ) 

サンプルビュー:

from somewhere import SortHeaders 
from django.contrib.auth.models import User 
from django.shortcuts import render_to_response 

LIST_HEADERS = (
    ('Username', 'username'), 
    ('First Name', 'first_name'), 
    ('Last Name', 'last_name'), 
    ('Email', None), 
) 

def user_list(request): 
    sort_headers = SortHeaders(request, LIST_HEADERS) 
    users = User.objects.order_by(sort_headers.get_order_by()) 
    return render_to_response('users/user_list.html', { 
     'users': users, 
     'headers': list(sort_headers.headers()), 
    }) 

サンプルテンプレート(users/user_list.html):

{% load my_tags %} 
<table cellspacing="0"> 
<thead> 
    <tr> 
{% table_header headers %} 
    </tr> 
</thead> 
<tbody> 
    {% for user in users %}<tr class="{% cycle odd,even %}"> 
    <td><a href="{{ user.get_absolute_url }}">{{ user.username }}</a></td> 
    <td>{{ user.first_name }}</td> 
    <td>{{ user.last_name }}</td> 
    <td>{{ user.email }}</td> 
    </tr> 
    {% endfor %} 
</tbody> 
</table> 

サンプル封入タグ(templatetags/my_tags.py):

from django import template 

def table_header(context, headers): 
    return { 
     'headers': headers, 
    } 

register = template.Library() 
register.inclusion_tag('table_header.html', takes_context=True)(table_header) 

サンプル封入タグTEMPL (table_header.html):

{% for header in headers %}<th{{ header.class_attr }}> 
    {% if header.sortable %}<a href="{{ header.url }}">{% endif %} 
    {{ header.text }} 
    {% if header.sortable %}</a>{% endif %} 
</th>{% endfor %} 
関連する問題