2010-08-22 61 views
1
class Article(models.Model): 
    def user_may_see_full_version(self, user): 
     # do something very sophisticated with the user 
     return [True/False whatever] 

現在我想創建這樣一個模板:什麼是Django的方式來做到這一點?

{% for article in articles %} 
    {% if article.user_may_see_full_version request.user %}{{ article }}{% else %}{{article.title }}{% endif %} 
{% endfor %} 

但是,這並不工作,因爲我不能將參數傳遞給方法...

有什麼好看解決這個問題的方法?

+1

,尋找在Django文檔。 – 2010-08-22 22:01:39

+0

顯示'非常複雜'的部分可能會有所幫助,可能這可以通過在視圖和/或模型中使用好的查詢集來解決,而不必回退到醜陋的模板邏輯。 – KillianDS 2010-08-23 10:38:43

回答

2

無法將參數直接從模板傳遞給方法。模板過濾器是最好的一段路要走:

{% if article|user_may_see_full_version:user %}{{ article }}{% else %}{{article.title }}{% endif %} 

該過濾器是這樣實現的:你想一個templatetag

@register.filter() 
def user_may_see_full_version(article, user): 
    return article.user_may_see_full_version(user) 
1

你打破了Django的模板中沒有邏輯的哲學。您可以使用其他模板語言,如Jinja2。但這樣你就會失去Django模板提供的一些很酷的東西。

因此,您最好的選擇是在視圖中生成該變量並將其傳遞給模板。因此,如果呈現模板的視圖通過的文章列表,其中每個人都有一個變量,名爲user_may_see_full_version那麼你根本就做:

{% if article.user_may_see_full_version %} whatever 

關注您的視圖處理邏輯。模板只是一種呈現信息的方式。

+0

但這需要迭代queryset兩次 - 不是很好;-) – Alex 2010-08-24 17:00:54

+0

取決於你如何實現,你不必。另一方面,使用過濾器標籤需要調用一個函數,每次調用另一個函數,創建內存上下文並且可能每次都敲擊數據庫。 Django的做事方式是不在模板內傳遞參數。 – maraujop 2010-08-27 14:13:34

相關問題