类似于 Jinja2/Flask 中的 'startswith' 的方法

Method similar to 'startswith' in Jinja2/Flask

我正在寻找类似于 python 的 startswith 的 method/way。 我想做的是 link table 中以 "i-".

开头的一些字段

我的步数:

  1. 我创建了过滤器,return True/False:

    @app.template_filter('startswith')
    def starts_with(field):
        if field.startswith("i-"):
                return True
        return False
    

然后link将其编辑为模板:

{% for field in row %}
            {% if {{ field | startswith }} %}
               <td><a href="{{ url_for('munin') }}">{{ field | table_field | safe }}</a></td>
            {% else %}
               <td>{{ field | table_field | safe}}</td>
            {% endif %}
     {% endfor %}

不幸的是,它不起作用。

第二步。我在没有过滤器的情况下做到了,但是在模板中

{% for field in row %}
            {% if field[:2] == 'i-' %}
               <td><a href="{{ url_for('munin') }}">{{ field | table_field | safe }}</a></td>
            {% else %}
               <td>{{ field | table_field | safe}}</td>
            {% endif %}
     {% endfor %}

可行,但向该模板发送不同的数据,并且仅适用于这种情况。我在想 [:2] 可能有点问题。

所以我尝试编写过滤器,或者可能有一些我在文档中跳过的方法。

表达式 {% if {{ field | startswith }} %} 将不起作用,因为您不能将块彼此嵌套。您可能可以使用 {% if (field|startswith) %},但 custom test 比过滤器更好。

类似

def is_link_field(field):
    return field.startswith("i-"):

environment.tests['link_field'] = is_link_field

然后在你的模板中,你可以写{% if field is link_field %}

更好的解决方案....

可以直接在field中使用startswith,因为field是一个python字符串。

{% if field.startswith('i-') %}

更多,您可以使用任何String函数,例如str.endswith()

在 Jinja2 中,您可以使用 regex_search() 对您的字符串进行正则表达式测试:

field | regex_search("^i-")

如果您的字符串有“i-”且行首由脱字符“^”表示,return 为真。