是否可以对 DJango 模板中的一组相关项目进行排序?
即:这段代码(为了清楚起见,省略了 HTML 标签):
{% for event in eventsCollection %}
{{ event.location }}
{% for attendee in event.attendee_set.all %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
显示almost正是我想要的。我唯一想要更改的是按姓氏排序的与会者列表。我试过这样说:
{% 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的回答后。
陶马斯完全按照我提出的方式解决了这个问题——尽管解决方案并不是我所期望的。结果我学到了一种有用的技术,也可以在其他情况下使用。
汤姆的回答提出了一种我在OP中已经提到过的方法,并因“丑陋”而暂时拒绝。
“丑陋”是一种本能反应,我想澄清它出了什么问题。在这样做的过程中,我意识到这是一种丑陋的方法,因为我沉迷于将查询集传递给要渲染的模板的想法。如果我放宽这一要求,那么有一种不丑陋的方法应该可行。
我还没有尝试过这个,但假设视图代码不是传递查询集,而是迭代查询集,生成事件列表,然后用对应参加者的查询集装饰每个事件WAS以所需的方式排序(或过滤,或其他方式)。像这样:
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 的技术,对小表使用上述技术
表格,将大和小的定义留给读者(笑。)