Как отобразить упорядоченный словарь в шаблонах 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>
Как я могу отображать данные отсортированным способом?
Большое спасибо.
Ответы
Ответ 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
Ответ 3
Хотя изменение кода в представлении предпочтительнее, вы также можете использовать тег шаблона 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>
Ответ 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, поскольку он не словарь больше, но список кортежей.
Надеюсь, что это поможет кому-то.