Home » Django » Django template tag to truncate text

Django template tag to truncate text

Posted by: admin November 30, 2017 Leave a comment

Questions:

Django has truncatewords template tag, which cuts the text at the given word count. But there is nothing like truncatechars. What’s the best way to cut the text in the template at given char length limit?

Answers:

This has recently been added in Django 1.4. e.g.:

{{ value|truncatechars:9 }}

See doc here

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

Update

Since version 1.4, Django have a built-in template tag for this:

{{ value|truncatechars:9 }}

Questions:
Answers:

I made my own template filter, that add “…” to the end of (last word of) the (truncated) string as well:

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

Questions:
Answers:

You should write a custom template filter: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

Have a look at how truncatewords is built in django.utils.text

Questions:
Answers:

Here it is in the Django Documentation, Built-in template tags and filters: truncatechars

Questions:
Answers:

slice

Questions:
Answers:

Adding a “truncate” filter was a feature request for 4 years but finally landed in trunk, as far as I understand https://code.djangoproject.com/ticket/5025 – so we’ve to wait for the next release or use trunk.

Questions:
Answers:

If you prefer to create your own custom template tag, consider to use the Django util Truncator in it. The following is a sample usage:

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

Then you can put it in a template tag:

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)