Django ha un truncatewords
tag 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:
Questo è stato recentemente aggiunto in Django 1.4. per esempio:
{{ value|truncatechars:9 }}
{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}
Aggiornare
Dalla versione 1.4, Django ha un tag template integrato per questo:
{{ value|truncatechars:9 }}
truncatechars
filtro aggiunge un carattere di ellisse per impostazione predefinita.
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
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)
Eccolo nella documentazione di Django, tag e filtri dei modelli incorporati: truncatechars
Dovresti scrivere un filtro modello personalizzato: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
Dai un'occhiata a come truncatewords
è integratodjango.utils.text
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.
truncatechars
dovrebbe essere preferito, poiché è più esplicito.
L'aggiunta di un filtro "troncato" era una richiesta di funzionalità per 4 anni, ma alla fine è arrivata nel trunk, per quanto ne so https://code.djangoproject.com/ticket/5025 , quindi dobbiamo aspettare la prossima versione o utilizzare tronco.