是否有一个简单的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' %}
答案 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:在可能的情况下,您应该将检查放在视图内,而不是放在模板内。