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

时间:2010-07-05 06:08:19

标签: python django django-templates

我有一个用于管理期刊文章列表的Django项目。主要模型是Article。这有各种各样的领域来存储文章的标题,出版日期,主题,以及文章中提到的公司列表。 (company是它自己的模型)。

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

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

首先,company字段是ManyToMany字段。我现在使用all iterable成功打印了这个,这要归功于这个问题=)。 (很奇怪,Django文档中记录了这个all可迭代的地方吗?)

listing objects from ManyToManyField

但是,我想在每个项目之后打印“,”(逗号后跟空格),除了最后一项。所以输出将是:

Joe Bob Company, Sarah Jane Company, Tool Company

而不是:

Joe Bob Company, Sarah Jane Company, Tool Company,

你如何使用Django的模板系统实现这一目标?

其次,每个Article都有一个名为category的CharField,用于存储文章的类别。如果可能的话,我希望文章按类别排序。所以我使用QuerySet,并在article_list中获得一个很好的相关文章列表。然后,我使用regroup模板标记将其分类并打印每个类别。

{ 'tennis': ('article_4', 'article_5')
  'cricket': ('article_2', 'article_3')
  'ping pong': ('article_1')
}

但是,在将其传递给regroup之前,我需要确保输入列表已排序。我的问题是,使用dictsort template-tag在模板内对其进行排序是否更好,或者我应该使用QuerySet的order_by调用?

我认为最好使用regroup,而不是尝试在视图中用Python编写代码?

干杯, 维克多

2 个答案:

答案 0 :(得分:17)

第一个问题

使用python之类的连接过滤器

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

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

第二个问题

  

我的问题是,使用起来更好   dictsort模板标签对此进行排序   在模板内部,或者我应该使用   而不是QuerySet的order_by调用?

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

  

我认为最好使用重组,而不是尝试编码   这个我自己在Python里面的视图?

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

答案 1 :(得分:15)

第一个问题请尝试forloop.last

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