2010-11-02 11 views
5

El filtro truncatewords inserta un espacio antes de la elipsis. Al igual que en, 'Un libro de recetas de vacaciones multa de ...'
frente a la deseada
'Un buen libro de recetas de vacaciones ...'¿Cómo agregar una elipsis en una plantilla de Django usando truncatewords sin el espacio final?

¿Hay una manera fácil de conseguir este filtro para no poner un espacio allí? Me podría encargar de esto en la vista con bastante facilidad, pero preferiría hacerlo en la plantilla, idealmente sin crear un filtro personalizado. Cualquier sugerencia es bienvenida.

Respuesta

5

Hay un montón de filtros plantilla en Djangosnippets y 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í, tengo algo similar en función de las vistas. Creo que también podría hacer una etiqueta de plantilla, ¿eh? Gracias por el enlace. – JAL

+1

Hmm, la pregunta sigue siendo por qué el comportamiento predeterminado de Django es insertar un espacio cuando esto es incorrecto. – thepeer

2

Esto también funciona:

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

Básicamente, simplemente rebanar los últimos 4 caracteres (elipse espacio plus) , y luego agréguelo sin espacio

Lo bueno es que, con este método también puede finalizar su, uh, el truncamiento con cualquier cosa que le gustaría.

+4

El problema obvio con este método es que si su 'valor' es más corto que el número pasado a 'truncatewords', entonces simplemente está cortando los últimos 4 caracteres y agregando una elipse. Por supuesto, siempre se puede evitar eso midiendo la longitud de 'value' y usando un bucle' if'. – tankadillo

+0

Además del truncamiento excesivo mencionado anteriormente, esto también siempre agregará el '...', incluso si la cadena es lo suficientemente corta (por ejemplo, '" blah "| truncatewords: 3' mostraría' blah', no 'blah ... '). – dbr

+2

Para poner los comentarios de jbpjackson y dbr en otras palabras, no haga esto. – slypete

Cuestiones relacionadas