django 获取字符串的第一部分
有没有简单的Django标签可以在模板中获取字符串的前x个字符?
在一组模型实例中,我想根据每个对象的状态给它们不同的符号。状态可能是“等待中”、“成功”或者“失败 XXXX”,其中XXXX是错误代码。
我想检查对象实例的状态的前5个字符是否等于“错误”,如果是的话,符号就会变成红色。但是,我该怎么做呢?在Python中,我可以用objectinstance.status[:5]来实现。
通过使用这个链接,我用一种“复杂”的拼接方法实现了这个功能,但有没有像.left()或.right()这样简单的方法呢?
{% if run.status|make_list|slice:":5"|join:"" == 'error' %}
2 个回答
如果你使用的是Django 1.4或更高版本,可以使用truncatechars
这个标签,但它只能部分解决你的问题,并且会在字符串末尾加上省略号。
除了像你已经做的那样拼接多个过滤器之外,唯一可行的方法就是写一个自定义过滤器。下面是一个你可以根据需要调整的初步草稿:
from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter
@stringfilter
def slicestring(value, arg):
"""usage: "mylongstring"|slicestring:"2:4" """
els = map(int, arg.split(':'))
return value[els[0]:els[1]]
作为额外的好处,这个过滤器几乎可以完全模拟切片的用法,只需提供一个“切片字符串”作为参数。唯一的例外是语法[:9]
,需要用[0:9]
替换,所以你可以这样使用这个参数:yourvariable|slicestring:"0:9"
附注:因为你的问题是“获取字符串的第一部分”,我认为自定义过滤器可能是正确的答案。不过,如果你获取切片字符串的唯一原因是为了在if
语句中检查它的一部分,那么我同意Anton的看法:尽量把检查放在视图中,而不是模板里。
你可以试试:
{% if run.status|truncatechars:5 == 'error...' %}
(可以查看 Django文档中的truncatechars)
不过我想说,作为一个总体的建议,你不应该把这种逻辑放在Django的模板里(在其他框架中叫视图)。你应该把它放在Django的视图里(在其他框架中叫控制器)。也就是说,你可以在你的视图中写类似这样的代码:
has_error = run.status.startswith('error')
确保将has_error传递给模板,并且:
{% if has_error %}
虽然这样可能会多花一些功夫,但检测错误的逻辑可以在多个视图和模板之间共享,这样可以把控制逻辑和视图逻辑分开。