GAE/Django模板(0.96)过滤器以获得GqlQuery和filter i的长度

2024-06-08 09:04:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我想输出结果的评论数量,我尝试这样做:

^{pr2}$

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

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

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

这样我不仅可以得到所有评论的数量,而且只能得到带有一定评论的评论数据库参考属性例如,()属性。在

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

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

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


Tags: 模板列表数量by属性评论ordercp
3条回答

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

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

如果您喜欢一种不太常见的样式,模板中有很多逻辑(一种很多人认为奇怪的体系结构),那么可以考虑其他模板系统,如Mako,因为Django模板系统实际上是针对这种“奇怪的体系结构”而设计的。在

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

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

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

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

然后在python代码中,您需要使用一个惟一的处理程序修改WSGIApplication对象。比如:

^{pr2}$

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

^{3}$

就这样,你可以随意扩展,增加更多的层次。在类Products中,只需使用ProductID变量作为条件筛选查询对象。在

我在我的Blog上有一篇更深入的文章,如果你想读更多的话。在

相关问题 更多 >