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?

Respostas:



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 }}

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

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)



1

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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.