Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模板切片-反向顺序_Python_Django_Django Templates - Fatal编程技术网

Python Django模板切片-反向顺序

Python Django模板切片-反向顺序,python,django,django-templates,Python,Django,Django Templates,多亏了我从另一个问题中学到的非常有用的提示,我可以通过在模板中切片来限制列表中的值的数量,如下所示: {% for comment in thread.comment_set.all|slice:":3" %} 现在我想得到我评论的最后3个结果,所以我想简单的“-3”或“-3”就可以了,唉: Caught an exception while rendering: Negative indexing is not supported. 还使用: {% for comment in threa

多亏了我从另一个问题中学到的非常有用的提示,我可以通过在模板中切片来限制列表中的值的数量,如下所示:

{% for comment in thread.comment_set.all|slice:":3" %}
现在我想得到我评论的最后3个结果,所以我想简单的“-3”或“-3”就可以了,唉:

Caught an exception while rendering: Negative indexing is not supported.
还使用:

{% for comment in thread.comment_set.all|slice:":3" reversed %}
不这样做,因为如果我有5条注释,而不是1,2,3,它会按3,2,1的顺序显示前三条注释

有没有什么方法可以不进入我的数据库就显示一篇文章的最后3条评论?我希望能够做到这一点纯粹使用模板系统

解决方案

{% for comment in thread.comment_set.all|dictsortreversed:"created"|slice:"3" %}

由于我的表具有创建的时间戳,所以显示了最后三个。我没有看到经常使用dictsortreversed筛选器,根据文档,它需要一个键进行排序

{% for comment in thread.comment_set.all|dictsortreversed:"name"|slice:"3" %}

Django的数据库查询是惰性计算的,因此
thread.comment\u set.all
的结果是查询集,而不是列表。QuerySet支持许多类似列表的函数,但不支持负切片,因此索引错误不是来自模板过滤器本身。(如果您感到好奇,QuerySet对象上的切片会被转换为SQL语句上的
limit
子句,这就是为什么不能使用负数的原因)

一般来说,Django鼓励严格分离模板和模型;
views.py
模块是一个粘合剂,您可以在其中执行任何需要数据库模型和queryset方法知识的工作,以将模型数据转换为模板的简单变量和结构

在Django模板中通常不会看到从模板对模型运行相关查询,这是有充分理由的。现在,从comment_集中分割最后三个元素似乎非常简单。但是请记住,数据库不会以任何保证的顺序返回结果。这意味着,除了切片之外,现在还需要添加order_by子句;在模板中根本没有表达这一点的方法,也不应该有。最好将视图视为模型和模板之间的转换,并让这些面向数据库的工作在那里完成,而不是嵌入到HTML中

在这种情况下,我建议您从视图向模板传递一个有序切片:

# take first three sorted descending
comments = thread.comment_set.order_by('-something')[:3]

context = Context({'comments':comments})
return HttpResponse(tmplt.render(context))
如果您必须在模板中进行切片,并且确实不关心结果的排序,请将列表传递给模板。
切片
过滤器将愉快地执行负切片:

comments = list(thread.comment_set.all())
context = Context('comments':comments)
在模板中:

{% for comment in comments|slice:"-3:" %}

在将列表传递给模板之前,您不能对其进行切片吗?

使用Comment类的Meta类的“ordering”属性来设置所需的元素顺序


IMO模板不是订购数据集的合适位置。应在模型或视图中进行排序。

如果查询集已按“已创建”排序,则可以对其进行反向排序。所以这里有一个更快的解决方案

{% for comment in thread.comment_set.all.reverse|slice:":3" %}
如果你不想按相反的顺序

{% for comment in thread.comment_set.all.reverse|slice:":3"|dictsort:"created" %}

尽管您应该遵循上面Jarrets Hardie的建议,在视图中而不是在模板中执行所有这些逻辑。

我想,我需要的只是这个,并制定了一个更完整的解决方案。希望大家觉得有用。视图需要找到的id。您必须颠倒顺序,获取输入的最新最后一条记录的id(PK),这将是第一条记录,现在在堆的顶部很容易找到;-)。计算所需的下限id值,然后在末尾使用此运算符从下限排序到最新或最后一个条目…[n:m](我认为这只是一个列表运算符),删除不需要的记录,然后按正常顺序显示。对于django表示例,以下是我的代码:

def showLatestRels(request):
    #This view shows the latest 15 entries in the Release table
    LastInserted = Release.objects.order_by('-pk')[0]
    UpperLimit = LastInserted.id
    LowerLimit = UpperLimit - 15
    RelTable = Release.objects.all()
    tablevalslat = ReleaseTable(RelTable[LowerLimit:UpperLimit])
    RequestConfig(request).configure(tablevalslat)
    return render(request, 'DCESrtap/latrels.html', {'tablevalslat': tablevalslat}
)

有很多方法可以做到这一点,请参见

但是无法让dictsort的想法发挥作用……

我喜欢我得到和修改的答案,我实际上是在拉线程表,然后从模板拉各自的注释,因此Django正在做拉正确注释的工作。我会说,我不太在乎这样一个事实,它只会把每一条评论都拉出来,然后把它们都切成3条,这确实很好,因为它把它们都拉了出来,我按照它们创建的日期对它们进行排序,然后把它们切成几条。如果有一个我可以写的查询,可以把X条线索和它们各自的最后三条评论都拉出来,那我就太棒了。相反,我会这样做。如果可以,我会给你们所有+1:-/15代表:(