grigy
grigy

Reputation: 6826

Django template tag to truncate text

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?

Upvotes: 116

Views: 123393

Answers (9)

Dos
Dos

Reputation: 2507

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.

Upvotes: 12

Banjer
Banjer

Reputation: 8300

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

{{ value|truncatechars:9 }}

See doc here

Upvotes: 217

Abuko Sidney
Abuko Sidney

Reputation: 31

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.

Upvotes: 3

caio
caio

Reputation: 1979

{{ 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 }}

Upvotes: 73

pmourelle
pmourelle

Reputation: 95

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

Upvotes: 4

Hraban
Hraban

Reputation: 555

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.

Upvotes: 0

jki
jki

Reputation: 4791

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

Upvotes: 12

Abid A
Abid A

Reputation: 7858

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

Upvotes: 3

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798536

slice

Upvotes: 1

Related Questions