【发布时间】:2011-07-11 07:06:17
【问题描述】:
Django 有truncatewords 模板标签,它会在给定字数处剪切文本。但是没有像 truncatechars 这样的东西。
在给定的字符长度限制下剪切模板中文本的最佳方法是什么?
【问题讨论】:
Django 有truncatewords 模板标签,它会在给定字数处剪切文本。但是没有像 truncatechars 这样的东西。
在给定的字符长度限制下剪切模板中文本的最佳方法是什么?
【问题讨论】:
【讨论】:
{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}
更新
从 1.4 版开始,Django 有一个 built-in template tag 用于此:
{{ value|truncatechars:9 }}
【讨论】:
truncatechars 过滤器默认添加一个椭圆字符。
我制作了自己的模板过滤器,也将“...”添加到(截断的)字符串的(最后一个单词)的末尾:
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
【讨论】:
如果您更喜欢创建自己的自定义模板标签,请考虑在其中使用 Django util Truncator。以下是一个示例用法:
>>> 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 ...'
然后你可以把它放在一个模板标签中:
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)
【讨论】:
在 Django 文档中,Built-in template tags and filters: truncatechars
【讨论】:
您应该编写一个自定义模板过滤器:http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
看看truncatewords是如何内置在django.utils.text中的
【讨论】:
您可以使用类似的代码实现您的目标:
{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}
NUM_OF_CHARS_TO_TRUNCATE 是要离开的字符数。
【讨论】:
【讨论】:
truncatechars 应该是首选,因为它更明确。
添加“截断”过滤器是一项 4 年的功能请求,但最终落入主干,据我了解 https://code.djangoproject.com/ticket/5025 - 所以我们必须等待下一个版本或使用主干。
【讨论】: