2010-03-28 99 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