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