Django模板 - 打印逗号分隔的ManyToManyField,将结果列表排序为字典?
我有一个Django项目,用来管理期刊文章的列表。主要的模型是Article
,它有很多字段来存储文章的标题、出版日期、主题,还有提到的公司列表。(company
是一个单独的模型。)
我想要一个模板,能够打印出按类别排序的文章列表,并且列出提到的公司。
不过,我遇到了两个问题。
首先,company
字段是一个多对多的字段。我现在已经成功打印出来了,使用了all
这个可迭代对象,这要感谢一个StackOverflow的问题。=)(不过我很好奇,这个all
可迭代对象在Django文档中哪里有说明呢?)
但是,我想在每个项目后面加上", "(逗号后面跟一个空格),除了最后一个项目。所以输出应该是:
Joe Bob Company, Sarah Jane Company, Tool Company
而不是:
Joe Bob Company, Sarah Jane Company, Tool Company,
我该如何在Django的模板系统中实现这个呢?
其次,每个Article
都有一个字符字段,叫做category
,用来存储文章的类别。如果可能的话,我希望文章能按类别排序。所以我使用了QuerySet,得到了一个相关的文章列表,叫做article_list。然后我使用regroup
模板标签把这些按类别分类并打印出来。
{ 'tennis': ('article_4', 'article_5')
'cricket': ('article_2', 'article_3')
'ping pong': ('article_1')
}
但是,我需要确保在把输入列表传给regroup
之前,它是已经排序好的。我的问题是,使用dictsort
模板标签在模板内部排序更好,还是应该使用QuerySet的order_by
方法呢?
我想,使用regroup
会比在视图中自己用Python编写这个要更好吧?
谢谢,
Victor
2 个回答
试试用 forloop.last
来解决你的第一个问题
{% for company in article.companys.all %}
{{company.name}}{% if not forloop.last %}, {% endif %}
{% endfor %}
第一个问题
如何使用类似Python的join过滤器
{{ article.company.all|join:", " }}
http://docs.djangoproject.com/en/dev/ref/templates/builtins/#join
第二个问题
我的问题是,直接在模板里用dictsort这个标签来排序好,还是用QuerySet的order_by方法更好呢?
我会选择用QuerySet的order_by。因为我喜欢在数据库里处理这些事情。因为如果数据量很大,你可以利用数据库的索引来加快速度。
我想用regroup会更好,而不是在视图里自己用Python来写这个,对吗?
对,使用regroup肯定更好,直接用Python的原生函数会更方便。