我将带有评论的查询传递给我的模板:
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的想法,但我真的希望只用模板解决它:(有一些原因)。它可能会像它一样丑陋。
答案 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处更深入地写一下。