Django ma truncatewords
tag 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?
Odpowiedzi:
Zostało to niedawno dodane w Django 1.4. na przykład:
{{ value|truncatechars:9 }}
{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}
Aktualizacja
Od wersji 1.4, Django ma wbudowany tag szablonu do tego:
{{ value|truncatechars:9 }}
truncatechars
filtr dodaje elipsę charakter domyślnie.
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
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)
Tutaj jest w dokumentacji Django, wbudowane tagi szablonów i filtry: truncatechars
Powinieneś napisać niestandardowy filtr szablonu: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
Zobacz, jak truncatewords
jest wbudowanydjango.utils.text
truncatechars
powinno być preferowane, ponieważ jest bardziej wyraźne.
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_TRUNCATE
jest liczba znaków do pozostawienia.
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.