3

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

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

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

使用https://docs.djangoproject.com/en/dev/ref/templates/builtins/我设法通过以下“怪异”连接来做到这一点,但是有没有像 .left() 或 .right() 这样简单的东西?

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

2 回答 2

5

你可以试试:

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

(参见Django 文档中的截断字符)

尽管我可能会说,总的来说,您不应该将这种逻辑放在您的 Django 模板(其他框架中的视图)中。您想将其放入 Django 视图(其他框架中的控制器)。意思是,在你看来,你会是这样的:

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

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

{% if has_error %}

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

于 2013-03-04T22:42:32.640 回答
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 的观点:如果可能,您应该将检查放在视图内,而不是模板内。

于 2013-03-04T22:46:22.677 回答