【发布时间】:2011-09-26 06:29:31
【问题描述】:
是否可以在 DJango 模板中对一组相关项目进行排序?
即:这段代码(为清楚起见省略了HTML标签):
{% for event in eventsCollection %}
{{ event.location }}
{% for attendee in event.attendee_set.all %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
显示几乎正是我想要的。我唯一要更改的是按姓氏排序的与会者列表。我试过这样说:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_set.order_by__last_name %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
唉,上面的语法不起作用(它产生一个空列表),我想到的任何其他变体也不起作用(报告了很多语法错误,但没有乐趣)。
当然,在我看来,我可以生成某种排序的与会者列表数组,但这是一个丑陋且脆弱(我是否提到过丑陋)的解决方案。
不用说,但我还是要说,我已经仔细阅读了在线文档并搜索了 Stack Overflow 和 django-user 的档案,但没有找到任何有用的东西(啊,如果只有一个查询集是一个字典 dictsort会做这项工作,但它不是而且它没有)
===============================================
编辑添加了额外的想法 接受 Tawmas 的回答后。
Tawmas 完全按照我提出的方式解决了这个问题——尽管解决方案不是我所期望的。结果,我学到了一种有用的技术,也可以在其他情况下使用。
Tom 的回答提出了一种我已经在我的 OP 中提到的方法,并暂时拒绝为“丑陋”。
“丑”是一种本能反应,我想澄清一下它有什么问题。在这样做的过程中,我意识到这是一个丑陋的方法的原因是因为我对将查询集传递给要呈现的模板的想法很感兴趣。如果我放宽该要求,则应该有一种不丑陋的方法。
我还没有尝试过,但是假设视图代码不是传递查询集,而是通过查询集迭代生成事件列表,然后用相应参与者的查询集装饰每个事件,以所需的方式排序(或过滤,或其他)。像这样:
eventCollection = []
events = Event.object.[filtered and sorted to taste]
for event in events:
event.attendee_list = event.attendee_set.[filtered and sorted to taste]
eventCollection.append(event)
现在模板变成:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_list %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
缺点是视图必须一次“实现”所有事件,如果有大量事件,这可能是一个问题。当然可以添加分页,但这会使视图变得相当复杂。
好处是“准备要显示的数据”代码在它所属的视图中,让模板专注于格式化视图提供的数据以供显示。这是天经地义的事。
所以我的计划是对大表使用 Tawmas 的技术,对小表使用上述技术 表格,大小的定义留给读者(笑)
【问题讨论】:
标签: python django django-templates sql-order-by