Django | 在模板中排序字典

8 投票
6 回答
21791 浏览
提问于 2025-04-15 17:46

我想把一个字典按键的顺序打印出来。其实在视图中排序键很简单,只需要把键放到一个列表里,然后对这个列表进行排序。接下来我想在模板中循环遍历这些键,然后从字典中获取对应的值。

{% for company in companies %}
    {% for employee, dependents in company_dict.company.items %}
    {% endfor %}
{% endfor %}

(这个例子是我自己编的……)出问题的地方是“company_dict.company.items”这一部分。我需要“company”是循环中“company”的值,而不是在字典里找一个叫“company”的键。现在这个“company”部分在找一个名为“company”的键,而不是上面循环中“company”的值。

我正在处理一些数据,把字典中的字典组合在一起。改变数据的布局并不是一个选项。我觉得正确的方法是写一个模板标签,只是想知道有没有我错过的内置方法。

6 个回答

1

这个最后的解决方案对我也很有帮助。我正在使用Django 1.6.2,发现它把字典(dict)转换成了一个列表(list),其中字典的键作为列表的第一个元素,内容作为第二个元素。所以即使我传入的是一个字典,它也把它当成了一个列表来处理。因此,我对上面的内容做了一些调整,变成了这样,结果对我来说是有效的:

@register.filter(name='sort')
def listsort(value):
    if isinstance(value, list):
        return sorted(value, key=lambda k:k[0])
    else:
        return value
19

创建一个自定义过滤器,像这样:

from django import template
from django.utils.datastructures import SortedDict

register = template.Library()

@register.filter(name='sort')
def listsort(value):
    if isinstance(value, dict):
        new_dict = SortedDict()
        key_list = sorted(value.keys())
        for key in key_list:
            new_dict[key] = value[key]
        return new_dict
    elif isinstance(value, list):
        return sorted(value)
    else:
        return value
    listsort.is_safe = True

然后在你的模板中,你可以这样调用它:

{% for key, value in companies.items|sort %}
      {{ key }} {{ value }}
{% endfor %}

这样你就可以通过键来获取排序后的字典了。

3

自定义模板过滤器可以解决这个问题。

from django import template
register = template.Library()

def dict_get(value, arg):
    #custom template tag used like so:
    #{{dictionary|dict_get:var}}
    #where dictionary is duh a dictionary and var is a variable representing
    #one of it's keys

    return value[arg]

register.filter('dict_get',dict_get)

关于自定义模板过滤器的更多信息,请查看这里:http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#howto-custom-template-tags

在你的例子中,你可以这样做:

{% for employee, dependents in company_dict|company %}

撰写回答