2010-07-05 73 views
6

我有一个用于管理期刊文章列表的Django项目。主要型号是Article。这里有各种领域来存储文章标题,出版日期,主题以及文章中提到的公司名单等内容。 (company是它自己的模型)。Django模板 - 打印逗号分隔ManyToManyField,将结果列表排序为字典?

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

但是,我遇到了两个问题。

首先,company字段是ManyToMany字段。我现在成功地使用all迭代了,这要归功于这个SO问题=)。 (虽然好奇,这是哪里all迭代Django文档中记录?)

listing objects from ManyToManyField

不过,我想打印“” 每个项目后,(逗号后面空格),除的最后一项。因此,输出将是:

Joe Bob Company, Sarah Jane Company, Tool Company 

,而不是:

Joe Bob Company, Sarah Jane Company, Tool Company, 

如何与Django的模板系统实现这一目标?

其次,每个Article都有一个CharField,名为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编写自己的代码?

干杯, 维克多

回答

14

第一个问题

使用Python一样加入过滤器

{{ article.company.all|join:", " }} 

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#join

第二个问题

我的问题是,是它更好地使用 的dictsort模板标签这个 在模板中进行排序,或者我应该使用 查询集的ORDER_BY通话呢?

我会使用QuerySet的order_by。我喜欢在DB中做这样的事情。因为使用巨大的数据集,您可以使用数据库索引。

而且我认为最好使用重组,而不是试图在视图中使用Python编码 ?

重组。使用python本地函数肯定会更好。

15

尝试forloop.last关于第一个问题

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

Upvoted you =)。然而,我很好奇 - 这种方法在任何方面都优于其他解决方案中的“加入”模板标签? – victorhooi 2010-07-07 03:51:43

+4

我认为他们是用于两种不同的用途。如果你只有一个字符串或int数组,比使用join。如果你有一个必须迭代的对象,你必须使用这个方法。 – killerbarney 2011-02-01 13:24:57

+2

当您想要做类似的事情时也很有用: '{%for article.companys.all%} {{company.name}} {%如果不是forloop.last%},{%endif%} {%endfor%}' – datakid 2015-06-02 07:16:12