Django 模板标记截断文本

Django 有 truncatewords模板标记,它在给定的单词数量下切割文本。

在给定的字符长度限制下裁剪模板中的文本的最佳方法是什么?

107411 次浏览

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

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

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.

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

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

\{\{ value|truncatechars:9 }}

See doc here

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)

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.