Django中的SortedDict

时间:2012-03-13 20:24:46

标签: python django django-templates sorteddictionary ordereddictionary

我有一个字典,其中包含我想在模板中显示的列表:

from django.utils.datastructures import SortedDict

time_filter = SortedDict({
    0 : "Eternity",
    15 : "15 Minutes",
    30 : "30 Minutes",
    45 : "45 Minutes",
    60 : "1 Hour",
    90 : "1.5 Hours",
    120 : "2 Hours",
    150 : "2.5 Hours",
    180 : "3 Hours",
    210 : "3.5 Hours",
    240 : "4 Hours",
    270 : "4.5 Hours",
    300 : "5 Hours"
})

我想在模板中创建一个下拉列表:

<select id="time_filter">
    {% for key, value in time_filter.items %}
        <option value="{{ key }}">{{ value }}</option>
    {% endfor %}
</select>

但是下拉列表中的元素并没有以字典中定义的顺序出现。我错过了什么?

4 个答案:

答案 0 :(得分:5)

here

你正在做“那不行”的事情,给出未排序的字典作为排序字典的输入。

你想要

SortedDict([
    (0, 'Eternity'),
    (15, '15 minutes'),
    # ...
    (300, '300 minutes'),
])

答案 1 :(得分:5)

考虑使用Python的许多字典实现之一,按照排序顺序维护密钥。例如,sortedcontainers module是纯Python和快速实现。它支持快速get / set / iter操作并保持按键排序。还有一个performance comparison,可以根据其他几个流行的选择对实施进行基准测试。

答案 2 :(得分:2)

您使用“普通”SortedDict作为参数实例化dict - 您的排序将丢失。您必须使用保留排序的iterable实例化SortedDict,例如:

SortedDict((
   (0, "Eternity"),
   (15, "15 Minutes"),
   # ...
))

答案 3 :(得分:1)

这个答案可能无法准确回答这个问题,您可以使用django模板标签中的“dictsort”和“dictsortreversed”来排序普通字典。所以不需要使用SortedDict。