Тег шаблону Django для усічення тексту


88

Django має truncatewordsтег шаблону, який вирізає текст при заданій кількості слів. Але немає нічого подібного до різаків .

Який найкращий спосіб вирізати текст у шаблоні з заданою межею довжини символу?

Відповіді:



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

Оновлення

Починаючи з версії 1.4, Django має вбудований тег шаблону для цього:

{{ value|truncatechars:9 }}

Оскільки я працюю з Django до 1.4, це саме те, що мені потрібно. Дякую!
Trey Piepmeier

1
truncatecharsфільтр додає еліпс символ за замовчуванням.
cnfw

10

Я створив власний шаблон фільтра, який також додав "..." у кінець (останнього слова) рядка (усіченого):

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
За замовчуванням це django.
Pulkit Sharma

6

Якщо ви віддаєте перевагу створювати власний тег шаблону, розгляньте можливість використання в ньому утиліти Django Truncator . Нижче наведено зразок використання:

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

Потім ви можете помістити його в тег шаблону:

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

Дякую, але це не зовсім те, що мені потрібно.
grigy

Як так? З його допомогою можна нарізати рядки.
Ігнасіо Васкес-Абрамс

Документація говорить, що це для списків. Також він не додає "..." до усіченого тексту.
grigy

1
"..." потрібно додавати, лише якщо він був усічений.
grigy

2
Це відповідає на питання OP, і це буде працювати зі старими версіями Django. Хоча truncatecharsслід віддавати перевагу новим версіям , оскільки вони є більш явними.
прямокутник

1

Ви можете досягти своєї мети за допомогою подібного коду:

{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

де NUM_OF_CHARS_TO_TRUNCATEкількість символів, які слід залишити.


0

Додавання фільтра "усікання" було запитом функції протягом 4 років, але нарешті потрапило в багажник, наскільки я розумію https://code.djangoproject.com/ticket/5025 - тому нам доведеться почекати наступного випуску або використання стовбур.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.