Balise de modèle Django pour tronquer le texte


88

Django a une truncatewordsbalise de modèle, qui coupe le texte au nombre de mots donné. Mais il n'y a rien de tel que les truncatechars .

Quelle est la meilleure façon de couper le texte dans le modèle à une limite de longueur de caractères donnée?

Réponses:



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

Mise à jour

Depuis la version 1.4, Django a une balise de modèle intégrée pour cela:

{{ value|truncatechars:9 }}

Puisque je travaille avec Django pré-1.4, c'est exactement ce dont j'avais besoin. Merci!
Trey Piepmeier

1
le truncatecharsfiltre ajoute un caractère d'ellipse par défaut.
cnfw

10

J'ai créé mon propre filtre de modèle, qui ajoute également "..." à la fin du (dernier mot de) la chaîne (tronquée):

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
Sa valeur par défaut est maintenant django.
Pulkit Sharma

6

Si vous préférez créer votre propre étiquette de modèle personnalisé, pensez à utiliser le Django util troncature en elle. Voici un exemple d'utilisation:

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

Ensuite, vous pouvez le mettre dans une balise de modèle:

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

Merci, mais ce n'est pas tout à fait ce dont j'ai besoin.
grigy

Comment? Il peut être utilisé pour découper des chaînes.
Ignacio Vazquez-Abrams

La documentation dit que c'est pour les listes. De plus, il n'ajoute pas "..." au texte tronqué.
grigy

1
Le "..." ne doit être ajouté que s'il a été tronqué.
grigy

2
Cela répond à la question de l'OP, et cela fonctionnera avec les anciennes versions de Django. Bien que les versions plus récentes truncatecharsdevraient être préférées, car elles sont plus explicites.
rectangletangle

1

Vous pouvez atteindre votre objectif avec un code similaire:

{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

NUM_OF_CHARS_TO_TRUNCATEest le nombre de caractères à laisser.


0

L'ajout d'un filtre "tronqué" était une demande de fonctionnalité pendant 4 ans mais a finalement atterri dans le coffre, pour autant que je sache https://code.djangoproject.com/ticket/5025 - nous devons donc attendre la prochaine version ou l'utilisation tronc.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.