django得到一个字符串的第一部分

时间:2013-03-04 22:00:22

标签: python django

是否有一个简单的django标签来获取模板中字符串的前x个字符?

在一个模型实例列表中,我想为每个objectinstance提供一个不同的符号,具体取决于objectinstance的状态。状态可能是“等待”,“成功”或“XXXX失败”,XXXX是错误代码。

我想检查objectinstance.status =='error'的前5个字符,然后该符号将为红色。但是,我该怎么做?在Python中,我可以使用objectinstance.status [:5]。

使用https://docs.djangoproject.com/en/dev/ref/templates/builtins/我设法通过遵循“monstruous”连接来实现这一点,但是有一些简单的东西,如.left()或.right()吗?

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

2 个答案:

答案 0 :(得分:4)

你可以尝试:

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

(参见Django文档中的truncatechars

虽然我可能会说,作为一个总体观点,你不应该把这种逻辑放在你的Django模板中(其他框架中的视图)。你想把它放到Django视图(其他framerworks中的控制器)。意思是,在你看来你会这样:

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

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

{% if has_error %}

可能需要做更多的工作,但是可以在多个视图和模板之间共享检测错误条件的逻辑,并将控制逻辑与视图逻辑分开。

答案 1 :(得分: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:在可能的情况下,您应该将检查放在视图内,而不是放在模板内。