2011-03-08 24 views
55

Django tiene truncatewords etiqueta de plantilla, que corta el texto en la cuenta de la palabra dada. Pero no hay nada como truncatechars. ¿Cuál es la mejor manera de cortar el texto en la plantilla a un límite de longitud de caracteres dado?etiqueta de plantilla de Django para truncar el texto

Respuesta

102

Esto ha sido recientemente añadido en Django 1.4. ej .:

{{ value|truncatechars:9 }} 

See doc here

+2

"truncatechars" está trabajando en el último Django 1.9 también –

1
+0

Gracias, pero esto no es del todo lo que necesito. – grigy

+0

¿Cómo es eso? Se puede usar para cortar cadenas. –

+0

La documentación dice que es para listas. Además, no agrega "..." al texto truncado. – grigy

46
{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %} 

actualización

Desde la versión 1.4, Django tiene un built-in template tag para esto:

{{ value|truncatechars:9 }} 
+0

Dado que estoy trabajando con Django anterior a 1.4, esto es exactamente lo que necesitaba. ¡Gracias! –

+2

Mejor aún, el uso de '& hellip;' en lugar de ... – mlissner

+0

la [ 'truncatechars'] (https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#truncatechars) filtro añade un carácter elipse por defecto. – cw1998

9

hice mi propio filtro de plantilla, que se suman "..." al final de la (última palabra de) la cadena (truncada), así:

from django import template 
register = template.Library() 

@register.filter("truncate_chars") 
def truncate_chars(value, max_length): 
    if len(value) > max_length: 
     truncd_val = value[:max_length] 
     if not len(value) == max_length+1 and value[max_length+1] != " ": 
      truncd_val = truncd_val[:truncd_val.rfind(" ")] 
     return truncd_val + "..." 
    return value 
+0

Su predeterminado ahora es django. –

0

Adición un filtro "truncado" fue una solicitud de función durante 4 años, pero finalmente aterrizó en el tronco, por lo que entiendo https://code.djangoproject.com/ticket/5025 - así que tenemos que esperar a la próxima versión o usar el tronco.

0

Si prefiere crear su propia etiqueta de plantilla personalizada, considere usar el Django util Truncator en ella. La siguiente es una muestra de uso:

>>> from django.utils.text import Truncator 
>>> Truncator("Django template tag to truncate text") 
<Truncator: <function <lambda> at 0x10ff81b18>> 
>>>Truncator("Django template tag to truncate text").words(3) 
u'Django template tag...' 
Truncator("Django template tag to truncate text").words(1) 
u'Django...' 
Truncator("Django template tag to truncate text").chars(20) 
u'Django template t...' 
Truncator("Django template tag to truncate text").chars(10) 
u'Django ...' 

A continuación, se puede poner en una etiqueta de plantilla:

from django import template 
from django.utils.text import Truncator 

register = template.Library() 

@register.filter("custom_truncator") 
def custom_truncator(value, max_len, trunc_chars=True): 
    truncator = Truncator(value) 
    return truncator.chars(max_len) if trunc_chars else truncator.words(max_len) 
Cuestiones relacionadas