[Django]-Django template tag to truncate text

213๐Ÿ‘

โœ…

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

{{ value|truncatechars:9 }}

See doc here

๐Ÿ‘คBanjer

72๐Ÿ‘

{{ 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 }}
๐Ÿ‘คcaio

12๐Ÿ‘

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
๐Ÿ‘คjki

11๐Ÿ‘

If you go on creating your own custom template tag, consider to leverage the native Django util Truncator.

The following is a sample usage of the Truncator util:

>>> 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").chars(20)
u'Django template t...'

And here how you can use it inside a Django 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_words=False):
    """ Set trunc_words=True to truncate by words instead of by chars."""
    truncator = Truncator(value)
    return truncator.words(max_len) if trunc_words else truncator.chars(max_len)

Eventually you can import the custom_truncator in any Django template.

๐Ÿ‘คDos

4๐Ÿ‘

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

๐Ÿ‘คpmourelle

3๐Ÿ‘

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

๐Ÿ‘คAbid A

3๐Ÿ‘

You can achieve your goal with similar code:

{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

where NUM_OF_CHARS_TO_TRUNCATE is number of chars to leave.

๐Ÿ‘คAbuko Sidney

1๐Ÿ‘

0๐Ÿ‘

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.

๐Ÿ‘คHraban

Leave a comment