sortingDjango模板中的相关项目

是否可以在DJango模板中sorting一组相关的项目?

那就是:这段代码(为了清楚,省略了HTML标签):

{% for event in eventsCollection %} {{ event.location }} {% for attendee in event.attendee_set.all %} {{ attendee.first_name }} {{ attendee.last_name }} {% endfor %} {% endfor %} 

显示几乎完全想要我想要的。 我想改变的唯一的事情是我按照姓氏sorting的与会者名单。 我试过这样说:

 {% for event in events %} {{ event.location }} {% for attendee in event.attendee_set.order_by__last_name %} {{ attendee.first_name }} {{ attendee.last_name }} {% endfor %} {% endfor %} 

唉,上面的语法不起作用(它产生一个空的列表),也没有任何其他的变化,我想到了(很多的语法错误报告,但没有喜悦)。

当然,在我看来,我可以生成一些sorting的参与者列表,但这是一个丑陋而脆弱的(我提到丑陋的)解决scheme。

不用说,但我会说,无论如何,我已经细读了在线文档和search堆栈溢出和django用户的档案没有发现任何有用的东西(啊,如果只有一个查询集字典dictsort会做工作,但事实并非如此)

==============================================

接受Tawmas的回答之后,编辑添加额外的想法。


当我提出这个问题时,Tawmas解决了这个问题 – 尽pipe解决scheme并不是我所期望的。 因此,我学习了一种可用于其他情况的有用技巧。

汤姆的回答提出了我在OP中已经提到的方法,暂时被拒绝为“丑陋”。

“丑陋”是一个直觉反应,我想澄清什么是错的。 在这样做的时候,我意识到这是一个丑陋的方法的原因是因为我挂起了传递查询设置到模板的想法被渲染。 如果我放松这个要求,那么应该有一个不可靠的方法。

我还没有尝试过,但假设不是通过查询集,视图代码遍历查询集产生一个事件列表,然后装饰每个事件的查询设置相应的与会者,这是为了sorting(或过滤,或任何)以所需的方式。 像这样的东西:

 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的技术用于大型的桌子和上面的小桌子的技术,大小的定义留给读者(笑)。

您需要在参与者模型中指定sorting,如下所示。 例如(假设你的模型类被命名为Attendee):

 class Attendee(models.Model): class Meta: ordering = ['last_name'] 

请参阅手册以作进一步参考。

编辑 。 另一个解决scheme是添加一个属性到你的事件模型,你可以从你的模板访问:

 class Event(models.Model): # ... @property def sorted_attendee_set(self): return self.attendee_set.order_by('last_name') 

你可以定义更多的这些,因为你需要他们…

您可以使用模板filterdictsort https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatefilter-dictsort

这应该工作:

 {% for event in eventsCollection %} {{ event.location }} {% for attendee in event.attendee_set.all|dictsort:"last_name" %} {{ attendee.first_name }} {{ attendee.last_name }} {% endfor %} {% endfor %} 

重组应该能够做你想做的,但是有没有一个理由,你不能按照你想要的方式来订购他们?