Tag de template do Django para truncar texto

88

Django tem um truncatewordstemplate tag, que corta o texto na contagem de palavras dada. Mas não há nada como truncatechars .

Qual é a melhor maneira de cortar o texto no modelo no limite de comprimento de caracteres determinado?

sujo
fonte

Respostas:

166

Isso foi adicionado recentemente no Django 1.4. por exemplo:

{{ value|truncatechars:9 }}

Veja doc aqui

Banjer
fonte
3
"truncatechars" também está trabalhando no último Django 1.9
Isanka Wijerathne
61
{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}

Atualizar

Desde a versão 1.4, o Django tem uma tag de modelo integrada para isso:

{{ value|truncatechars:9 }}
Caio
fonte
Como estou trabalhando com Django pré-1.4, isso é exatamente o que eu precisava. Obrigado!
Trey Piepmeier
1
o truncatecharsfiltro adiciona um caractere de elipse por padrão.
cnfw
10

Fiz meu próprio filtro de modelo, que adiciona "..." ao final da (última palavra) da string (truncada):

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
jki
fonte
2
Seu padrão agora é django.
Pulkit Sharma
6

Se você preferir criar sua própria tag de template customizada, considere usar o Django util Truncator nela. A seguir está um exemplo 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 ...'

Em seguida, você pode colocá-lo em uma tag de modelo:

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)
Dos
fonte
1

slice

Ignacio Vazquez-Abrams
fonte
Obrigado, mas não é bem disso que preciso.
grigy
Como assim? Ele pode ser usado para fatiar strings.
Ignacio Vazquez-Abrams
A documentação diz que é para listas. Também não acrescenta "..." ao texto truncado.
grigy,
1
O "..." precisa ser adicionado apenas se ficar truncado.
grigy
2
Isso responde à pergunta do OP e funcionará com versões mais antigas do Django. Embora com versões mais novas truncatecharsdeva ser preferível, por ser mais explícito.
retângulo de
1

Você pode atingir seu objetivo com um código semelhante:

{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

onde NUM_OF_CHARS_TO_TRUNCATEé o número de caracteres para sair.

Abuko Sidney
fonte
0

Adicionar um filtro "truncado" foi uma solicitação de recurso por 4 anos, mas finalmente caiu no tronco, pelo que eu entendo https://code.djangoproject.com/ticket/5025 - então temos que esperar pelo próximo lançamento ou uso tronco.

Hraban
fonte