Django-Vorlagen-Tag zum Abschneiden von Text

84

Django hat ein truncatewordsVorlagen-Tag, das den Text bei der angegebenen Wortzahl schneidet. Aber es gibt nichts Schöneres als Truncatechars .

Was ist der beste Weg, um den Text in der Vorlage bei einer bestimmten Zeichenlänge zu schneiden?

grigy
quelle

Antworten:

160

Dies wurde kürzlich in Django 1.4 hinzugefügt. z.B:

{{ value|truncatechars:9 }}

Siehe Dokument hier

Banjer
quelle
3
"truncatechars" arbeitet auch am neuesten Django 1.9
Isanka Wijerathne
59
{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}

Aktualisieren

Seit Version 1.4 verfügt Django über ein integriertes Vorlagen-Tag :

{{ value|truncatechars:9 }}
caio
quelle
Da ich mit Django vor 1.4 arbeite, ist dies genau das, was ich brauchte. Vielen Dank!
Trey Piepmeier
1
Der truncatecharsFilter fügt standardmäßig ein Ellipsenzeichen hinzu.
cnfw
10

Ich habe meinen eigenen Vorlagenfilter erstellt, der "..." auch am Ende (letztes Wort) der (abgeschnittenen) Zeichenfolge hinzufügt:

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
quelle
2
Seine Standardeinstellung ist jetzt Django.
Pulkit Sharma
5

Wenn Sie lieber ein eigenes benutzerdefiniertes Vorlagen-Tag erstellen möchten, sollten Sie den Django util Truncator verwenden . Das Folgende ist ein Beispiel für die Verwendung:

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

Dann können Sie es in ein Vorlagen-Tag einfügen:

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
quelle
1

slice

Ignacio Vazquez-Abrams
quelle
Danke, aber das ist nicht ganz das, was ich brauche.
Grigy
Wie? Es kann verwendet werden, um Zeichenfolgen zu schneiden.
Ignacio Vazquez-Abrams
Die Dokumentation sagt, es ist für Listen. Außerdem wird "..." nicht an abgeschnittenen Text angehängt.
Grigy
1
Das "..." muss nur hinzugefügt werden, wenn es abgeschnitten wurde.
Grigy
2
Dies beantwortet die Frage des OP und funktioniert mit älteren Versionen von Django. Bei neueren Versionen truncatecharssollte dies jedoch bevorzugt werden, da dies expliziter ist.
Rechteck
0

Das Hinzufügen eines "Abschneiden" -Filters war eine Funktionsanforderung für 4 Jahre, landete aber schließlich im Kofferraum, soweit ich https://code.djangoproject.com/ticket/5025 verstehe - also müssen wir auf die nächste Veröffentlichung oder Verwendung warten Kofferraum.

Hraban
quelle
0

Sie können Ihr Ziel mit ähnlichem Code erreichen:

{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

Wo NUM_OF_CHARS_TO_TRUNCATEist die Anzahl der Zeichen zu verlassen.

Abuko Sidney
quelle