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?

grigy
la source

Réponses:

166

Cela a été récemment ajouté dans Django 1.4. par exemple:

{{ value|truncatechars:9 }}

Voir doc ici

Banjer
la source
3
"truncatechars" travaille aussi sur le dernier Django 1.9
Isanka Wijerathne
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 }}
caio
la source
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
jki
la source
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)
Dos
la source
1

slice

Ignacio Vazquez-Abrams
la source
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.

Abuko Sidney
la source
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.

Hraban
la source