Django模板 - 打印逗号分隔的ManyToManyField,将结果列表排序为字典?

10 投票
2 回答
6782 浏览
提问于 2025-04-16 00:49

我有一个Django项目,用来管理期刊文章的列表。主要的模型是Article,它有很多字段来存储文章的标题、出版日期、主题,还有提到的公司列表。(company是一个单独的模型。)

我想要一个模板,能够打印出按类别排序的文章列表,并且列出提到的公司。

不过,我遇到了两个问题。

首先,company字段是一个多对多的字段。我现在已经成功打印出来了,使用了all这个可迭代对象,这要感谢一个StackOverflow的问题。=)(不过我很好奇,这个all可迭代对象在Django文档中哪里有说明呢?)

从ManyToManyField列出对象

但是,我想在每个项目后面加上", "(逗号后面跟一个空格),除了最后一个项目。所以输出应该是:

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 个回答

18

试试用 forloop.last 来解决你的第一个问题

{% for company in article.companys.all %}
  {{company.name}}{% if not forloop.last %}, {% endif %}
{% endfor %}
18

第一个问题

如何使用类似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的原生函数会更方便。

撰写回答