2010-10-23 103 views
1

我開發在谷歌AppEngine上一個項目,使用Django模板,所以我一定要使用標籤,如{{ aitem.Author }}我的HTML模板內打印內容。我怎樣才能區分字符串列表在Django模板

Author,但是,可以是一個字符串一個列表對象,我沒有辦法告訴它提前。當作者是一個列表,我嘗試打印在我的模板上,我得到了難看的結果

作者:[u'J。 K.羅琳,u'Mary GrandPr \ xe9' ]

有什麼辦法來處理這種情況的(基本上是印刷領域不同,這取決於它的類型)有效?我是否必須依靠自定義標籤或其他方式?

回答

6

我認爲最乾淨的解決方案將是一個方法添加到模型get_authors()它總是返回的任何一個或多個作者的列表。然後你可以使用:

Author: {{ aitem.get_authors|join:", " }} 

如果由於某種原因,只對模板的訪問和無法改變的模式,那麼你可以使用這樣一個黑客:

{% if "[" == aitem.Author|pprint|slice:":1" %} 
    Author: {{ aitem.Author|join:", " }} 
{% else %} 
    Author: {{ aitem.Author }} 
{% endif %} 

附:將大寫字母用於屬性名稱不是一個好習慣。

+0

你是對的,但不幸的是我不能夠修改模型是:我使用了一個庫,不能輕易改變的事情。這也解釋了這些不良名稱的特性。 – abahgat 2010-10-23 15:25:40

+2

而不是'pprint',是不是更好地檢查類型特定的方法?例如。 '如果author.islower'只在字符串中評估爲true。 – 2010-10-23 15:44:31

+0

好主意。我沒有想過這個。 – 2010-10-23 17:05:36

1

我認爲回聲報的get_authors()解決方案是最好的,但另一種可能是創建一個模板標籤,做測試。你需要閱讀custom template tags,但如果你看看現有的那些,它們並不難創造。

0

我跟馬修的建議,並最終實現了一個過濾器來處理列表。 我在這裏發佈它,以防萬一別人需要它。

@register.filter(name='fixlist') 
def fixlist(author): 
    if type(author) == list: 
     return ', '.join(author) 
    else: 
     return author 

我把它從模板頁這樣的{{ aitem.Author|fixlist }}

感謝您的幫助!

+1

說'如果isinstance(作者,列表):' – dbn 2015-06-14 08:49:54