Tag modello Django per troncare il testo


91

Django ha un truncatewordstag modello, che taglia il testo in base al numero di parole specificato. Ma non c'è niente come truncatechars .

Qual è il modo migliore per tagliare il testo nel modello a un dato limite di caratteri?

Risposte:



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

Aggiornare

Dalla versione 1.4, Django ha un tag template integrato per questo:

{{ value|truncatechars:9 }}

Dato che lavoro con Django pre-1.4, questo è esattamente ciò di cui avevo bisogno. Grazie!
Trey Piepmeier

1
il truncatecharsfiltro aggiunge un carattere di ellisse per impostazione predefinita.
cnfw

11

Ho creato il mio filtro modello, che aggiunge "..." anche alla fine della (ultima parola) della stringa (troncata):

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
Il suo valore predefinito ora è Django.
Pulkit Sharma

6

Se preferisci creare il tuo tag modello personalizzato, considera di utilizzare Django util Truncator in esso. Quello che segue è un esempio di utilizzo:

>>> 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 ...'

Quindi puoi metterlo in un tag modello:

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)



2

Puoi raggiungere il tuo obiettivo con un codice simile:

{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

dove NUM_OF_CHARS_TO_TRUNCATEè il numero di caratteri da lasciare.


1

Grazie, ma non è proprio quello che mi serve.
grigy

Come mai? Può essere utilizzato per suddividere le stringhe.
Ignacio Vazquez-Abrams

La documentazione dice che è per gli elenchi. Inoltre non aggiunge "..." al testo troncato.
grigy

1
Il "..." deve essere aggiunto solo se è stato troncato.
grigy

2
Questo risponde alla domanda dell'OP e funzionerà con le versioni precedenti di Django. Anche se con le versioni più recenti truncatecharsdovrebbe essere preferito, poiché è più esplicito.
angolo rettangolo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.