当前位置: 首页 > 面试题库 >

在Django模板中对相关项目进行排序

贺轶
2023-03-14
问题内容

是否可以在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的技术用于大型表,将上述技术用于小型表,并由读者来定义大与小的定义。


问题答案:

你需要像这样在与会者模型中指定顺序。例如(假设你的html" target="_blank">模型类名为Attendee):

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

请参阅手册以获取更多参考。

编辑。另一个解决方案是向事件模型添加一个属性,你可以从模板访问该属性:

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

你可以根据需要定义更多这些…



 类似资料:
  • 我想在RecycerView中对项目进行排序。我的用户名是20ABC1、20ABC2、…、20ABC10、…等等。 我尝试了相关问题的答案,其中一个是: 谢谢:)

  • 我有以下型号: 类类别(models.Model):名称=模型。字符域(最大长度=255) 类元素(models.Model): 课程主题(models.Model): 元素=模型。ForeignKey(元素)name=模型。夏菲尔德(max_length=255) 我基本上需要在category id=1中添加新主题,并只获得属于类别1的élément列表 我在category id=1中创建了

  • 点击排序-拖动分组或分组内的流程模板进行排序

  • 我认为这可能是Openshift试图在创建项目的同时创建对象的一个问题,但它在试图创建对象的时候没有找到项目。为了解决这个问题,我尝试使用注释,但得到了相同的错误 如能提供任何协助,将不胜感激

  • 问题内容: 我对Django有一个奇怪的问题。我会像平时一样在模板中循环遍历一组对象。但是,我需要将项目分为三部分。页面的布局如下所示: 绘画1-绘画2-绘画3 描述1 描述2 描述3 绘画4-绘画-5绘画6 说明4 说明5 说明6 等 我不能弄清楚真正做到这一点的最好的Django标签集。似乎有些棘手。{%cycle%}语句并没有太大帮助。 除非当然,否则我会进行某种形式的Java脚本黑客攻击,