2010-11-02 12 views
5

Il filtro truncatewords inserisce uno spazio prima dell'elipsis. Come in, 'Un bel libro di ricette vacanza di ...'
contro desiderato
'Una bella vacanza ricetta libro di ...'Come aggiungere un puntino di sospensione in un modello Django utilizzando i truncatewords senza lo spazio finale?

C'è un modo semplice per ottenere questo filtro per non mettere uno spazio lì? Potrei occuparmi di questo nella vista abbastanza facilmente, ma preferirei farlo nel modello - idealmente senza creare un filtro personalizzato. Qualsiasi suggerimento è benvenuto.

risposta

5

Ci sono un sacco di filtri template a Djangosnippets, e 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

Sì, ho qualcosa di simile come funzione per le viste. Penso che potrebbe anche solo fare un tag modello fuori di esso, hmm? Grazie per il link. – JAL

+1

Hmm, la domanda rimane perché il comportamento Django predefinito è quello di inserire uno spazio quando questo non è corretto. – thepeer

2

Questo funzionerà anche:

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

In sostanza, basta tagliare via gli ultimi 4 caratteri (ellisse più lo spazio) e quindi aggiungerlo nuovamente senza lo spazio!

La cosa buona è che con questo metodo puoi anche terminare il tuo, ehm, troncare con qualsiasi cosa desideri.

+4

Il problema ovvio con questo metodo è che se il tuo "valore" è più corto del numero passato a "truncatewords", allora stai tagliando gli ultimi 4 caratteri e aggiungendo un'ellisse. Ovviamente, puoi sempre ovviare a ciò misurando la lunghezza di 'value' e usando un ciclo' if'. – tankadillo

+0

Oltre al suddetto troncamento eccessivo, questo aggiungerà sempre anche '...', anche se la stringa è abbastanza corta (ad es. "Blah" | truncatewords: 3' mostrerebbe 'blah', non' blah ... '). – dbr

+2

Per inserire jbpjackson e i commenti di dbr in altre parole, si prega di non farlo. – slypete

Problemi correlati