2010-11-02 58 views
5

truncatewords過濾器在省略號之前插入一個空格。如, 「一個美麗的節日食譜的書......」
主場迎戰期望
「的罰款節日食譜書......」如何在沒有最終空格的情況下使用truncatewords在Django模板中添加省略號?

是否有一個簡單的方法來得到這個過濾器不把那裏有空間?我可以非常輕鬆地在視圖中處理這個問題,但寧願在模板中執行此操作 - 最好不創建自定義過濾器。歡迎任何建議。

回答

5

有在Djangosnippets一堆模板過濾器,並this one looks pretty neat

# From http://djangosnippets.org/snippets/1259/ 

from django import template 

register = template.Library() 

@register.filter 
def truncatesmart(value, limit=80): 
    """ 
    Truncates a string after a given number of chars keeping whole words. 

    Usage: 
     {{ string|truncatesmart }} 
     {{ string|truncatesmart:50 }} 
    """ 

    try: 
     limit = int(limit) 
    # invalid literal for int() 
    except ValueError: 
     # Fail silently. 
     return value 

    # Make sure it's unicode 
    value = unicode(value) 

    # Return the string itself if length is smaller or equal to the limit 
    if len(value) <= limit: 
     return value 

    # Cut the string 
    value = value[:limit] 

    # Break into words and remove the last 
    words = value.split(' ')[:-1] 

    # Join the words and return 
    return ' '.join(words) + '...' 
+0

是的,我有類似的功能的意見。我認爲不妨製作一個模板標籤,嗯?感謝您的鏈接。 – JAL 2010-11-03 00:44:31

+1

嗯,問題仍然是爲什麼默認的Django行爲是當這是不正確的時候插入一個空格。 – thepeer 2011-02-22 17:23:23

2

這也將工作:

{{ value|truncatewords:3|slice:"-4" }}... 

基本上,只要切下最後4個字符(橢圓加空格) ,然後添加它沒有空間!

整潔的事情是,用這種方法,你也可以用你想要的任何東西結束你的呃截斷。

+4

這種方法的一個明顯問題是,如果你的'value'比傳遞給'truncatewords'的數字更短,那麼你只需切掉最後4個字符並添加一個橢圓。當然,你可以通過測量'value'的長度和使用'if'循環來解決這個問題。 – tankadillo 2012-08-08 01:19:48

+0

除了上面提到的過多截斷之外,即使字符串足夠短,也會一直添加'...'(例如'「blah」| truncatewords:3'會顯示'blah',而不是'blah ...')。 – dbr 2012-09-06 20:02:14

+2

爲了讓jbpjackson和dbr的評論換句話說,請不要這樣做。 – slypete 2013-07-10 18:40:35

相關問題