Как сделать упорядоченный словарь в шаблонах Django? - PullRequest
38 голосов
/ 09 марта 2011

Я пытаюсь изучить шаблоны django, но это нелегко.У меня есть определенный views.py, содержащий словарь, который будет отображаться с помощью шаблона.Словарь состоит из пар ключ-значение, где ключ - это уникальные имена, а значения - некоторые значения, связанные с этими именами.Я отображаю словарь следующим образом:

return render_to_response('results.html', {'data': results_dict})

Теперь моя проблема заключается в том, что в моем шаблоне мне нужно отображать имена в алфавитном (или ASCIIbetical) порядке со значениями родственников.На самом деле в моем шаблоне у меня есть:

<table>
{% for key, value in data.items %}
    <tr>
        <td> {{ key }}: </td> <td> {{ value }} </td>
    </tr>
</table>

Как я могу отсортировать данные?Большое спасибо.

Ответы [ 4 ]

60 голосов
/ 09 марта 2011

В views.py (Python2):

return render_to_response('results.html',
    {'data': sorted(results_dict.iteritems())})

Или в views.py (Python3):

return render_to_response('results.html',
    {'data': sorted(results_dict.items())})

В файле шаблона:

{% for key, value in data.items() %}
    <tr>
        <td> {{ key }}: </td> <td> {{ value }} </td>
    </tr>
{% endfor %}
24 голосов
/ 18 января 2016

Хотя изменение кода в представлении предпочтительнее, вы также можете использовать тег шаблона dictsort:

https://docs.djangoproject.com/es/1.9/ref/templates/builtins/#std:templatefilter-dictsort

<table>
{% for key, value in data.items|dictsort:"0.lower" %}
    <tr>
        <td> {{ key }}: </td> <td> {{ value }} </td>
    </tr>
</table>
16 голосов
/ 21 июня 2015

Еще одно решение, которое мне очень помогло, и я думаю, что оно проще.Он использует OrderedDict() больше информации

В вашем views.py файле добавьте:

from collections import OrderedDict
def main(request):
    ord_dict = OrderedDict()
    ord_dict['2015-06-20'] = {}
    ord_dict['2015-06-20']['a'] = '1'
    ord_dict['2015-06-20']['b'] = '2'
    ord_dict['2015-06-21'] = {}
    ord_dict['2015-06-21']['a'] = '10'
    ord_dict['2015-06-21']['b'] = '20'
    return render(request, 'main.html', {'context': ord_dict})

Затем в вашем шаблоне вы можете сделать:

<table>
{% for key, value in context.items %}
    <tr>
        <td>{{ key }}</td>
        <td>{{ value.a }}</td>
        <td>{{ value.b }} </td>
    </tr>
{% endfor %}
</table>

Это вернет ключи словаря в том же порядке, в котором они были вставлены.

2015-06-20  1   2
2015-06-21  10  20
8 голосов
/ 04 августа 2012

Обновление старого вопроса, но это было то, на что я потратил некоторое время как программистский нуби. Это как бы расширяет ответ Юджи Томиты.

Как отсортировать словарь, который выглядит так:

{model_A_object: {key: value, ...},...}

от model_A_object.field.

Я заполняю его циклом for и использую его для хранения данных агрегации и т. Д. Для набора запросов, который я передаю шаблону.

Мне удалось сделать это (с помощью Shubuntu из #Django help):

    result = sorted(dictionary.iteritems(), key= lambda (k, v) :  (k.field, v))

Тогда в шаблоне:

    {% for model_A_object, data in result %}
        {% for key, value in data.items %}
            ...
        {% endfor %}
    {% endfor %}

Чисто и легко, но не так просто, чтобы понять новичку. Обратите внимание, что первый цикл for имеет результат , а не result.items , поскольку это больше не словарь, а список кортежей.

Надеюсь, это кому-нибудь поможет.

...