用于截断文本的Django模板标记

用于截断文本的Django模板标记,django,django-templates,Django,Django Templates,Django有truncatewordstemplate标记,它按给定的字数剪切文本。但没有什么能比得上truncatechars 以给定的字符长度限制剪切模板中的文本的最佳方法是什么?您应该编写一个自定义模板过滤器: 看看truncatewords是如何在django.utils.text {{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %} 更新 自1.4版以来,Django对此有一个解决方案: {{ value|t

Django有
truncatewords
template标记,它按给定的字数剪切文本。但没有什么能比得上truncatechars


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

您应该编写一个自定义模板过滤器:

看看
truncatewords
是如何在
django.utils.text

{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}
更新

自1.4版以来,Django对此有一个解决方案:

{{ value|truncatechars:9 }}

我制作了自己的模板过滤器,将“…”添加到(截断的)字符串的(最后一个单词)末尾:

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

添加“truncate”过滤器是4年来的一项功能要求,但据我所知,它最终进入了trunk,因此我们必须等待下一个版本或使用trunk。

这是Django文档中的内容,

最近在Django 1.4中添加了它。e、 g:

{{ value|truncatechars:9 }}

如果您喜欢创建自己的自定义模板标签,请考虑在其中使用Django UTL。以下是一个示例用法:

>>> 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 ...'

您可以使用类似的代码实现您的目标:

{{value_of_text | truncatechars:NUM_of_CHARS_TO_TRUNCATE}}


其中
NUM\u OF\u CHARS\u TO\u TRUNCATE
是要离开的字符数。

谢谢,但这不是我需要的。怎么会这样?它可以用来分割字符串。文档说它是用于列表的。此外,它不会将“…”附加到被截断的文本中。只有当它被截断时才需要添加“…”。这回答了OP的问题,这将适用于较旧版本的Django。虽然使用较新版本的
truncatechars
应该是首选,因为它更明确。因为我使用的是1.4之前的Django,这正是我所需要的。谢谢默认情况下,过滤器会添加一个椭圆字符。“truncatechars”正在使用最新的Django 1.9 alsoIts默认值,现在是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)