Подтвердить что ты не робот

Как отобразить упорядоченный словарь в шаблонах django?

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

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

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

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

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

4b9b3361

Ответ 1

В 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 %}
    <tr>
        <td> {{ key }}: </td> <td> {{ value }} </td>
    </tr>
{% endfor %}

Ответ 2

Другое решение, которое очень хорошо работало для меня, и я думаю, что это проще. Он использует 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

Ответ 4

Обновление старого вопроса, но это было то, что я потратил некоторое время на программирование noobie. Это виды расширений. Ответ Yuji Tomita.

Как отсортировать словарь, который выглядит следующим образом:

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

с помощью model_A_object.field.

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

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

    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 %}

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

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