是否可以在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 %}
las,上面的语法不起作用(它产生一个空列表),我想到的任何其他变体也没有(报告了很多语法错误,但没有喜悦)。
在我看来,我当然可以生成某种类型的已排序与会者列表,但这是一个丑陋且脆弱(我提到过丑陋)的解决方案。
不用说,但无论如何我还是会说,我仔细阅读了在线文档,搜索了Stack Overflow和django-user的档案,但没有发现任何帮助(啊,如果只有查询集是字典dictsort会做工作,但不是,不是)
==============================================
在接受Tawmas的回答后进行了编辑,以增加其他想法。
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的技术用于大型表,将上述技术用于小型表,并由读者来定义大与小的定义(笑)。