web-dev-qa-db-fra.com

Django balise de modèle pour tronquer le texte

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

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

70
grigy

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

{{ value|truncatechars:9 }}

Voir doc ici

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

Mise à jour

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

{{ value|truncatechars:9 }}
52
caio

J'ai créé mon propre filtre de modèle, qui ajoute également "..." à la fin de (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
9
jki
3
pmourelle

Si vous préférez créer votre propre balise de modèle personnalisé, pensez à utiliser le Django util Truncator. 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)
2
Dos

Vous devez écrire un filtre de modèle personnalisé: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

Découvrez comment truncatewords est intégré dans Django.utils.text

2
Abid A

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

0
Hraban