1

結果のリストごとのアイテム数で並べ替えた結果を表示するのではなく、リストを再グループ化する必要があります。

このようなもの:

{%  regroup car_models by make as car_models_by_make %}

{% for make in car_models_by_make|dictsort:"???" --> the problem %}
    {{ make.grouper }}  ({{ make.list|length }}) <br>
{% endfor %}

したがって、データが次の場合:

[
('panda','fiat'),
('500','fiat'),
('focus','ford')
]

結果は次のようになります。

fiat 2
ford 1

私が試したのは:dictsort: "make.list.count"、 "make.list.length"、 "make.list |length"..何も機能しませんでした。

4

3 に答える 3

2

ここには合わないと思いdictsortます。

>>> l = [('panda', 'fiat'), ('500', 'fiat'), ('focus', 'ford')]
>>> values = [i[1] for i in l]
>>> from collections import Counter
>>> c = Counter(values)
>>> c.most_common()
[('fiat', 2), ('ford', 1)]

独自のテンプレートタグを定義できます、

from django import template
from collections import Counter

register = template.Library()

@register.filter
def my_sort(l):
    values = [i[1] for i in l]
    c = Counter(values)
    return c.most_common()
于 2012-10-22T01:24:18.240 に答える
1

dictのソートされたリストとしてデータをテンプレートに渡す必要があります。

>>> data = [ ('panda','fiat'),
... ('500','fiat'),
... ('focus','ford') ]
>>> 
>>> from itertools import groupby

# note that we need to sort data before using groupby
>>> groups = groupby(sorted(data, key=lambda x: x[1]), key=lambda x:x[1])

# make the generators into lists
>>> group_list = [(make, list(record)) for make, record in groups]

# sort the group by the number of car records it has
>>> sorted_group_list = sorted(group_list, key=lambda x: len(x[1]), reverse=True)

# build the final dict to send to the template
>>> sorted_car_model = [{'make': make, "model": r[0]} for (make, records) in sorted_group_list for r in records]
>>> sorted_car_model
[{'make': 'fiat', 'model': 'panda'}, {'make': 'fiat', 'model': '500'}, {'make': 'ford', 'model': 'focus'}]

ここでの目標は、自動車メーカーが生産するモデルの数によってランク付けされるようにリストを並べ替えることです。

次に、以下を使用します。

{% regroup car_models by make as make_list %}

{% for item in make_list %}
    {{ item.grouper }} ({{ item.list|length }}) <br>
{% endfor %}

取得するため:

fiat 2
ford 1

参照:regroup


あなたのデータがあなたのコメントにあるもののように見える場合:

>>> car_models = [ 
...     {'make': 'ford', 'model': 'focus'},
...     {'make': 'fiat', 'model': 'panda'},
...     {'make': 'ford', 'model': '500'},
...     {'make': 'fiat', 'model': '500'},
...     {'make': 'opel', 'model': '500'},
...     {'make': 'opel', 'model': '500'},
...     {'make': 'opel', 'model': '500'},
... ] 
>>> 
>>> groups = groupby(sorted(car_models, key=lambda x:x['make']), key=lambda x:x['make'])
>>> groups = [(make, list(x)) for make, x in groups]
>>> sorted_group_list = sorted(groups, key=lambda x:len(x[1]), reverse=True)
>>> sorted_car_model = [{'make': make, 'model': r['model']} for (make, records) in sorted_group_list for r in records]

>>> sorted_car_model
[{'make': 'opel', 'model': '500'}, {'make': 'opel', 'model': '500'}, {'make': 'opel', 'model': '500'}, {'make': 'fiat', 'model': 'panda'}, {'make': 'fiat', 'model': '500'}, {'make': 'ford', 'model': 'fo
cus'}, {'make': 'ford', 'model': '500'}]

または、次のように結果をテンプレートに渡すこともできます。

>>> from collections import Counter
>>> l = [r['make'] for r in car_models]
>>> c = Counter(l)
>>> result = [{k: v} for k,v in dict(c).iteritems()]
>>> result = sorted(result, key=lambda x: x.values(), reverse=True)
[{'opel': 3}, {'fiat': 2}, {'ford': 2}]

次に、この結果をテンプレートに渡し、代わりに結果をレンダリングするだけです。

{% for r in result %}
    {% for k,v in r.items %}
        {{ k }} {{ v }}
    {% endfor %}j
{% endfor %}

その後、次のようになります。

opel 3
fiat 2
ford 2
于 2012-10-22T11:15:01.263 に答える
1

私が作成したこのテンプレートタグを使用して:

@register.filter()
def groups_sort(groups):

    groups.sort(key=lambda group: len(group['list']))
    return groups

@register.filter()
def groups_sort_reversed(groups):
    groups.sort(key=lambda group: len(group['list']), reverse=True)
    return groups

これを行うことが可能です:

{% load custom_templatetags %}
{%  regroup car_models by make as car_models_by_make %}

{% for make in car_models_by_make|groups_sort_reversed %}
    {{ make.grouper }}  ({{ make.list|length }}) <br>
{% endfor %}

あなたに与える

fiat 2
ford 1

groups_sortを使用すると、次のようになります。

ford 1
fiat 2

もちろんこれはDjangoモデルでも機能します

楽しみ

于 2012-10-23T10:01:56.760 に答える