如何在 django 模板中呈现有序字典?
Posted
技术标签:
【中文标题】如何在 django 模板中呈现有序字典?【英文标题】:How to render an ordered dictionary in django templates? 【发布时间】:2011-07-12 03:20:15 【问题描述】:我正在尝试学习 django 模板,但这并不容易。 我有一个包含要使用模板呈现的字典的 views.py。字典由键值对组成,其中键是唯一名称,值是与这些名称关联的一些值。我以以下方式呈现字典:
return render_to_response('results.html', 'data': results_dict)
现在我的问题是,在我的模板中,我需要以字母(或 ASCIIbetical)顺序显示名称以及亲属值。 实际上在我的模板中我有:
<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.items() %
<tr>
<td> key : </td> <td> value </td>
</tr>
% endfor %
【讨论】:
% for key, value in data.items() % thisd 在 Django 模板中不起作用 @MukeshKumar - 当我们在 django 模板中使用函数时需要避免 () 所以只需要使用 'data.items'【参考方案2】:虽然更改视图中的代码更可取,但您也可以使用 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>
【讨论】:
很好的答案。值得一提的是,我们也可以使用dictsortreverse 进行倒序排序。 完美。谢谢 感谢您 - 完美运行。由于最后一个示例here,我几乎发现了这一点,但在尝试dictsort:0
时遇到了困难(即0 上没有引号)。任何人都可以在文档中解释这一点吗?【参考方案3】:
另一个对我来说效果很好的解决方案,我认为它更简单。它使用OrderedDict()
more info
在您的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
【讨论】:
有效。在OrderedDict()
调用中完成这一切会很好【参考方案4】:
刷新旧问题,但这是我作为编程菜鸟花了一些时间的东西。 它有点扩展了 Yuji Tomita 的答案。
如何对如下所示的字典进行排序:
model_A_object: key: value, ...,...
按model_A_object.field。
我用 for 循环填充它,并用它来存储一些聚合等数据,用于我传递给模板的查询集。
我已经设法做到了(通过#Django 帮助中的 Shubuntu):
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 %
简洁明了,但对于初学者来说并不容易弄清楚。请注意,第一个 for 循环的 result 不是 result.items 因为它不再是字典,而是元组列表。
希望对某人有所帮助。
【讨论】:
以上是关于如何在 django 模板中呈现有序字典?的主要内容,如果未能解决你的问题,请参考以下文章
将带有对象列表的字典作为 django 中的值呈现,但模板不显示值
Django - 在模板中格式化/访问 Pandas.to_dict() 数据框