Django 使用模板标签分割文本字段
我知道可以用 {{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
等等。