如何在Django模板中渲染有序字典?

43 投票
4 回答
48181 浏览
提问于 2025-04-16 13:22

我正在学习Django模板,但这并不简单。
我有一个views.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>

我该如何以排序的方式渲染这些数据呢?非常感谢。

4 个回答

16

还有一个对我来说非常有效的解决方案,我觉得这个方法更简单。它使用了 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
29

虽然在视图中修改代码是更好的选择,但你也可以使用 dictsort 模板标签:

https://docs.djangoproject.com/en/stable/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>
60

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

撰写回答