Python GAE/Django模板(0.96)筛选以获取GqlQuery的长度并对其进行筛选

Python GAE/Django模板(0.96)筛选以获取GqlQuery的长度并对其进行筛选,python,google-app-engine,django-templates,Python,Google App Engine,Django Templates,我将带注释的查询传递到我的模板: COMM = CommentModel.gql("ORDER BY created") doRender(self,CP.template,{'CP':CP,'COMM':COMM, 'authorize':authorize()}) 我想输出评论的数量作为结果,我尝试这样做: <a href="...">{{ COMM|length }} comments</a> 这不起作用(是的,因为COMM是Gql

我将带注释的查询传递到我的模板:

    COMM = CommentModel.gql("ORDER BY created")

    doRender(self,CP.template,{'CP':CP,'COMM':COMM, 'authorize':authorize()})
我想输出评论的数量作为结果,我尝试这样做:

    <a href="...">{{ COMM|length }} comments</a>

这不起作用(是的,因为COMM是GqlQuery,而不是列表)。我能用它做什么?有没有办法将GqlQuery转换为list,或者有其他解决方案?(第一项问题)[1]

第二个问题[2]是,如何在模板中筛选此列表?有没有这样的结构:

    <a href="...">{{ COMM|where(reference=smth)|length }} comments</a>

因此,我不仅可以获取所有注释的数量,还可以仅获取具有特定db.ReferenceProperty()属性的注释,例如

最后一个问题[3]:使用模板做这样的事情是不是很奇怪

UPD:多亏了尼克·约翰逊和亚历克斯·马泰利,问题[1]和[3]对我来说非常清楚

问题[2]很棘手,可能与MVC的理念背道而驰,但我真的希望只使用模板来解决它:(有一些原因)。它可能很难看。

您可以在
GqlQuery
对象上使用,但是
GqlQuery
不允许您添加
where
子句等—您需要它(及其方法)

是的,用诸如过滤之类的业务逻辑方面“污染”视图逻辑(即模板)是非常罕见的。通常,服务器端Python代码将执行此类调用并在上下文中注入结果,而视图逻辑(模板)只严格处理表示问题——服务器端决定显示什么,视图逻辑只决定如何显示

如果你喜欢一个不太常见的样式,在模板中有很多逻辑(一个很多人认为奇怪的架构),考虑替代模板系统,比如Django模板系统真的是针对这样一个“奇怪的体系结构”而设计的。p> 您可以在

GqlQuery
对象上使用,但是
GqlQuery
不允许您添加
where
子句等—您需要这样做(及其方法)

是的,用诸如过滤之类的业务逻辑方面“污染”视图逻辑(即模板)是非常罕见的。通常,服务器端Python代码将执行此类调用并在上下文中注入结果,而视图逻辑(模板)只严格处理表示问题——服务器端决定显示什么,视图逻辑只决定如何显示

如果你喜欢一个不太常见的样式,在模板中有很多逻辑(一个很多人认为奇怪的架构),考虑替代模板系统,比如Django模板系统真的是针对这样一个“奇怪的体系结构”而设计的。p> Call.fetch(),返回结果列表,然后将其传递给模板。任何其他解决方案(如调用.count())都会导致多次执行查询,从而浪费CPU和挂钟时间

同样,如果需要过滤查询,则应在将结果传递给模板系统之前,在自己的代码中进行过滤。

在查询上调用.fetch(),在将结果传递给模板之前,返回结果列表。任何其他解决方案(如调用.count())都会导致多次执行查询,从而浪费CPU和挂钟时间


同样,如果您需要过滤查询,在将结果传递到模板系统之前,您应该在自己的代码中进行过滤。

我不确定您试图完成什么,但您可能会从URL映射中受益,不过这需要一些额外的代码。其基本思想是,您可以将要过滤的任何值转换为“目录”。举例将有助于:

<a href="basepath/{{ value.tofilterfrom }}">link text</a>
只需创建一个名为Products的新类,它就会自动提取筛选值并将其存储在变量中,如下所示:

class Products(webapp.RequestHandler):
    def get(self, ProductID):
就这样,你可以任意扩展,添加更多的级别。在Products类中,您只需使用ProductID变量作为条件筛选查询对象


如果您想进一步了解这方面的内容,我在我的网站上有一篇更深入的文章。

我不确定您的目标是什么,但您可能会从URL映射中受益,不过这需要一些额外的代码。其基本思想是,您可以将要过滤的任何值转换为“目录”。举例将有助于:

<a href="basepath/{{ value.tofilterfrom }}">link text</a>
只需创建一个名为Products的新类,它就会自动提取筛选值并将其存储在变量中,如下所示:

class Products(webapp.RequestHandler):
    def get(self, ProductID):
就这样,你可以任意扩展,添加更多的级别。在Products类中,您只需使用ProductID变量作为条件筛选查询对象

如果你想更多地了解这方面的内容,我会在我的网站上写一篇更深入的文章