django 获取字符串的第一部分

3 投票
2 回答
4370 浏览
提问于 2025-04-17 17:55

有没有简单的Django标签可以在模板中获取字符串的前x个字符?

在一组模型实例中,我想根据每个对象的状态给它们不同的符号。状态可能是“等待中”、“成功”或者“失败 XXXX”,其中XXXX是错误代码。

我想检查对象实例的状态的前5个字符是否等于“错误”,如果是的话,符号就会变成红色。但是,我该怎么做呢?在Python中,我可以用objectinstance.status[:5]来实现。

通过使用这个链接,我用一种“复杂”的拼接方法实现了这个功能,但有没有像.left()或.right()这样简单的方法呢?

{% if run.status|make_list|slice:":5"|join:"" == 'error' %}

2 个回答

0

如果你使用的是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的看法:尽量把检查放在视图中,而不是模板里。

5

你可以试试:

{% if run.status|truncatechars:5 == 'error...' %}

(可以查看 Django文档中的truncatechars)

不过我想说,作为一个总体的建议,你不应该把这种逻辑放在Django的模板里(在其他框架中叫视图)。你应该把它放在Django的视图里(在其他框架中叫控制器)。也就是说,你可以在你的视图中写类似这样的代码:

has_error = run.status.startswith('error')

确保将has_error传递给模板,并且:

{% if has_error %}

虽然这样可能会多花一些功夫,但检测错误的逻辑可以在多个视图和模板之间共享,这样可以把控制逻辑和视图逻辑分开。

撰写回答