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

vic*_*ooi 8 python django django-templates

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

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

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

首先,该company字段是ManyToMany字段.我正在使用alliterable 成功打印这个,感谢这个SO问题=).(很奇怪,allDjango文档中记录了这个可迭代的地方吗?)

列出ManyToManyField中的对象

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

Joe Bob Company, Sarah Jane Company, Tool Company
Run Code Online (Sandbox Code Playgroud)

并不是:

Joe Bob Company, Sarah Jane Company, Tool Company,
Run Code Online (Sandbox Code Playgroud)

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

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

{ 'tennis': ('article_4', 'article_5')
  'cricket': ('article_2', 'article_3')
  'ping pong': ('article_1')
}
Run Code Online (Sandbox Code Playgroud)

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

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

干杯,维克多

mae*_*rsu 17

第一个问题

使用python之类的连接过滤器

{{ article.company.all|join:", " }}
Run Code Online (Sandbox Code Playgroud)

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

第二个问题

我的问题是,使用dictsort模板标签在模板内对其进行排序是否更好,或者我应该使用QuerySet的order_by调用?

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

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

重整旗鼓.使用python本机函数肯定更好.


cza*_*aic 15

试试forloop.last你的第一个问题

{% for company in article.companys.all %}
  {{company.name}}{% if not forloop.last %}, {% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • 我认为它们有两种不同的用途.如果你只有一个字符串或int数组,那么使用join.如果您有一个必须迭代的对象,则必须使用此方法. (4认同)
  • 当您想要执行以下操作时也很有用:`{%for company in article.companys.all%} <ahref ="{{company.get_absolute_url}}"> {{company.name}} </a> {%if不是forloop.last%},{%endif%} {%endfor%}` (2认同)