テーブル内のDjango要素の列をソートするにはどうすればよいですか?テーブル内のDjango要素の列をソートするにはどうすればよいですか?
私はDjango Adminがこれに気付いています。どうやって?
私がこれを読むことができるウェブリソースはありますか?
*「Djangoの要素は、」私はこのようになり、プラグイン可能なテンプレートオブジェクトを参照することでよ:
{{ x.y }}
テーブル内のDjango要素の列をソートするにはどうすればよいですか?テーブル内のDjango要素の列をソートするにはどうすればよいですか?
私はDjango Adminがこれに気付いています。どうやって?
私がこれを読むことができるウェブリソースはありますか?
*「Djangoの要素は、」私はこのようになり、プラグイン可能なテンプレートオブジェクトを参照することでよ:
{{ x.y }}
クエリからそれを取得している場合は、ビューでorder_by()
メソッドを使用します。リストの場合は、ビュー内でsort()
メソッドを使用します。
Djangoの管理者でチェンジビューのソースコードを見てみたワース:
http://code.djangoproject.com/svn/django/branches/releases/1.2.X/django/contrib/admin/views/main.py
注文プロセスは、おおよそ次のとおりです。
あなたが管理者で列ヘッダをクリックしてください、これは、要求に応じて利用可能なURL内の関連する注文パラメータでページをリロードする.GET
この注文パラメータは、チェンジ・ビューに解析される:
self.order_field、self.order_type = self.get_orderingを()
クエリセットが生成される:
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つです!
管理者が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 %}
ありがとうございました。私が探していたものです。これは別の質問です。ビジュアルの場合、管理者はヘッダーをシェーディングし、asc/desc、矢印を追加します。これはビューまたはHTML/Jqueryで行われますか? – pythondjango
これはテンプレートとビューで行われます。 –