Django 使用模板标签分割文本字段

1 投票
1 回答
1055 浏览
提问于 2025-04-18 14:21

我知道可以用 {{value|truncatewords:x}} 这个方式来截断一个文本字段,限制在一定数量的单词后面。那么,如果我想在文本中间夹一些东西,能不能使用被截断的那部分呢?就像在Python中使用字符串那样,如果我给出

>>>string[:2]
>>>something in between
>>>string[2:]

但我想用模板标签,因为我在一个循环中遍历,无法通过视图传递它?

谢谢

1 个回答

1

在这里,你需要一个自定义模板过滤器

下面是一个简单的例子,基于truncatewords()过滤器的实现:

from django import template
from django.template.defaultfilters import stringfilter
from django.utils.text import Truncator

register = template.Library()

@register.filter(is_safe=True)
@stringfilter
def sandwich(value, args):
    length, cutlet = args.split(',')
    length = int(length)
    truncated_value = Truncator(value).words(length, truncate='')
    return ' '.join([truncated_value, cutlet, value[len(truncated_value):].strip()])

示例输出:

>>> from django.template import Template, Context
>>> template = Template('{% load filters %}{{ value|sandwich:"2,magic" }}')
>>> context = Context({'value': 'What a wonderful world!'})
>>> template.render(context)
u'What a magic wonderful world!'

需要注意的是,Django不允许在模板过滤器中传入多个参数——这就是为什么它们被作为用逗号分隔的字符串传入,然后再进行解析。想了解更多这个想法,可以查看这里:如何在Django模板中为自定义模板过滤器添加多个参数?

另外,你可能还需要处理一些可能出现的异常,比如如果字符串中只传入了一个参数,length的值无法转换为int等等。

撰写回答