2013-03-04 78 views
3

是否有一个简单的django标签可以获取模板中字符串的前x个字符?django获取字符串的第一部分

在modelinstances的列表中,我想根据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' %} 

回答

4

你可以尝试:

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

(见truncatechars Django文档)

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

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

确保has_error被传递到模板和:

{% if has_error %} 

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

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]] 

作为奖金这个过滤器允许您通过提供“切片串”的说法几乎完全模仿切片标志。唯一的例外似乎有与[0:9]被替换的语法[:9],因此这种说法:yourvariable|slicestring:"0:9"

一个侧面说明:由于您的问题是“得到一个字符串的第一部分”我相信一个自定义过滤器是正确的答案,但如果得到一个切片的字符串的唯一理由是检查它的一部分在if声明中,那么我必须同意Anton的观点:您应该将您的检查放入视图中,而不是在模板中,如果可能。