2010-03-28 55 views
0

我通过查询与评论,我的模板:GAE/Django的模板(0.96)过滤器,以获取长度GqlQuery和过滤它

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:感谢尼克约翰逊和Alex Martelli,问题[1]和[3]对我来说非常清楚。

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

回答

1

你可以你GqlQuery对象使用count,但GqlQuery不会让你添加where条款之类 - 你需要Query为(及其filter方法)。

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

如果你喜欢一个更小的一贯风格,有很多逻辑的模板(一个架构,许多人认为不可思议),考虑其他的模板系统,如Mako,因为Django的模板系统是真正设计这样的“怪异的建筑“;-)。

3

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

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

0

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

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

然后在你的Python代码,你需要一个独特的处理程序修改WSGIApplication执行对象。喜欢的东西:

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

只需创建一个名为产品新的类,它会自动拾取过滤器值,并将其存储在一个变量的你,就像这样:

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

和多数民众赞成它,您可以尽可能多地扩展它,添加更多关卡。在类产品中,您只需使用ProductID变量作为条件来过滤Query对象。

如果您想了解更多信息,请点击我的Blog