Znacznik szablonu Django do obcinania tekstu

88

Django ma truncatewordstag szablonu, który wycina tekst przy podanej liczbie słów. Ale nie ma to jak truncatechary .

Jaki jest najlepszy sposób na wycięcie tekstu w szablonie przy podanym limicie długości znaków?

grigy
źródło

Odpowiedzi:

166

Zostało to niedawno dodane w Django 1.4. na przykład:

{{ value|truncatechars:9 }}

Zobacz dokument tutaj

Banjer
źródło
3
"truncatechars" również pracuje nad najnowszym Django 1.9
Isanka Wijerathne
61
{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}

Aktualizacja

Od wersji 1.4, Django ma wbudowany tag szablonu do tego:

{{ value|truncatechars:9 }}
caio
źródło
Ponieważ pracuję z Django starszymi niż 1.4, właśnie tego potrzebowałem. Dzięki!
Trey Piepmeier
1
truncatecharsfiltr dodaje elipsę charakter domyślnie.
cnfw
10

Zrobiłem własny filtr szablonu, który dodaje „...” na końcu (ostatniego słowa) (obciętego) ciągu:

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
źródło
2
Teraz jest to domyślnie django.
Pulkit Sharma
6

Jeśli wolisz stworzyć własny, niestandardowy tag szablonu, rozważ użycie w nim narzędzia Django util Truncator . Oto przykładowe użycie:

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

Następnie możesz umieścić go w tagu szablonu:

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
źródło
1

slice

Ignacio Vazquez-Abrams
źródło
Dzięki, ale to nie jest to, czego potrzebuję.
grigy
Jak to? Może być używany do krojenia strun.
Ignacio Vazquez-Abrams
Dokumentacja mówi, że to dla list. Nie dołącza też znaku „...” do obciętego tekstu.
grigy
1
Element „...” należy dodać tylko wtedy, gdy został obcięty.
grigy
2
To odpowiada na pytanie OP i będzie działać ze starszymi wersjami Django. Chociaż z nowszymi wersjami truncatecharspowinno być preferowane, ponieważ jest bardziej wyraźne.
prostokątny
1

Możesz osiągnąć swój cel za pomocą podobnego kodu:

{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

gdzie NUM_OF_CHARS_TO_TRUNCATEjest liczba znaków do pozostawienia.

Abuko Sidney
źródło
0

Dodanie filtru „obciętego” było żądaniem funkcji przez 4 lata, ale ostatecznie wylądowało w bagażniku, o ile rozumiem https://code.djangoproject.com/ticket/5025 - więc musimy poczekać na następną wersję lub użycie bagażnik samochodowy.

Hraban
źródło