【问题标题】:Method similar to 'startswith' in Jinja2/Flask类似于 Jinja2/Flask 中的 'startswith' 的方法
【发布时间】:2015-02-05 14:04:57
【问题描述】:

我正在寻找类似于python的startswith的方法/方式。 我想做的是链接表中以“i-”开头的一些字段。

我的步骤:

  1. 我创建了过滤器,它返回真/假:

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

然后将其链接到模板:

{% 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] 可能有点问题。

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

【问题讨论】:

  • “它不起作用”是什么意思?
  • 内部服务器错误

标签: flask jinja2


【解决方案1】:

更好的解决方案....

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

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

更多,你可以使用任何字符串函数,例如str.endswith()

【讨论】:

  • 这里的.name指的是什么?
  • 那是个错误。已编辑。
【解决方案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 %}

【讨论】:

  • 大家请看下面的答案
【解决方案3】:

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

field | regex_search("^i-")

如果你的字符串有 "i-" 并且行首由插入符号 "^" 符号表示,将返回 true。

【讨论】:

  • regex_search 是一个 ansible 过滤器,不是 Jinja2 的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多