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?

Antworten:



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 }}

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

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)



1

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.