开发者

Django template tag to truncate text

Django has truncatewords template tag, which c开发者_运维百科uts 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?


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

{{ value|truncatechars:9 }}

See doc here


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


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


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.


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


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


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.


slice


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜