GAE / Django模板(0.96)过滤以获得GqlQuery的LENGTH并对其进行过滤

时间:2010-03-28 14:53:43

标签: 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是GqlQuery,而不是列表)。我该怎么办?有没有办法将GqlQuery转换为列表或是否有另一种解决方案? (第一个问题)[1]

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

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

这样我不仅可以获得所有注释的数量,而且只能获得某些db.ReferenceProperty()属性的注释。

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

UPD:问题[1]和[3]对我来说非常清楚,感谢Nick Johnson和Alex Martelli。

问题[2]很棘手,可能违背了MVC的想法,但我真的希望只用模板解决它:(有一些原因)。它可能会像它一样丑陋。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您可以在GqlQuery对象上使用count,但GqlQuery不允许您添加where条款等 - 您需要Query为此(及其filter方法)。

是的,使用过滤等业务逻辑方面“污染”视图逻辑(即模板)是非常不寻常的。通常,服务器端Python代码会执行此类调用并将结果注入上下文中,使视图逻辑(模板)仅严格处理表示问题 - 服务器端决定要显示的内容,视图逻辑仅决定如何来展示它。

如果你喜欢一种不太常见的风格,模板中有很多逻辑(许多人认为很奇怪的架构),可以考虑使用其他模板系统,例如Mako,因为Django模板系统真正设计为反对这种“奇怪的架构”; - )。

答案 2 :(得分:0)

我不确定你想要完成什么,但你可能会从URL Mapping中受益,但它需要一些额外的代码。基本的想法是,您可以将要过滤的任何值转换为“目录”。示例将有所帮助:

<a href="basepath/{{ value.tofilterfrom }}">link text</a>

然后在您的python代码中,您需要使用唯一的处理程序修改WSGIApplication对象。类似的东西:

application = WSGIApplication(
                              [('/', MainPage),
                               (r'/basepath/(.*)', Products),

只需创建一个名为Products的新类,它将自动获取过滤器值并将其存储在变量中,如下所示:

class Products(webapp.RequestHandler):
    def get(self, ProductID):

就是这样,您可以根据需要扩展它,添加更多关卡。在类产品中,您只需使用ProductID变量作为条件来过滤Query对象。

如果您想了解更多内容,我会在Blog处更深入地写一下。