GAE/Django 模板 (0.96) 过滤器以获取 GqlQuery 的长度并对其进行过滤

Posted

技术标签:

【中文标题】GAE/Django 模板 (0.96) 过滤器以获取 GqlQuery 的长度并对其进行过滤【英文标题】:GAE/Django Templates (0.96) filters to get LENGTH of GqlQuery and filter it 【发布时间】:2011-02-01 18:17:48 【问题描述】:

我将带有 cmets 的查询传递给我的模板:

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

    doRender(self,CP.template,'CP':CP,'COMM':COMM, 'authorize':authorize())

我想输出 cmets 的数量作为结果,我尝试做这样的事情:

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

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

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

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

这样我不仅可以获得所有 cmets 的数量,还可以获得具有特定 db.ReferenceProperty() 属性的 cmets,例如。

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

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

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

【问题讨论】:

【参考方案1】:

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

<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):

就是这样,您可以随意扩展它,添加更多关卡。在 Products 类中,您只需使用 ProductID 变量作为条件过滤您的 Query 对象。

如果您想了解更多相关信息,请在我的Blog 上写一篇更深入的文章。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

如果您更喜欢不太常见的风格,模板中有很多逻辑(许多人认为这种架构很奇怪),请考虑替代模板系统,例如 Mako,因为 Django 模板系统的设计确实是针对 这种“奇怪的架构”;-)。

【讨论】:

以上是关于GAE/Django 模板 (0.96) 过滤器以获取 GqlQuery 的长度并对其进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

GAE Django webapp2 模板渲染

0.96 和 1.0 的 Django 模板继承的区别?

HBase(0.96以上版本)过滤器Filter详解及实例代码

GAE Django cloudsql 套接字

STM32F103C8T6+IIC OLED 0.96简单使用带串口调试输入出工程模板

从 Django 0.96 升级到 1.0 的最佳方式是啥?