首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jinja中的语法"if any() / if all() in object“

Jinja中的语法"if any() / if all() in object“
EN

Stack Overflow用户
提问于 2022-09-10 09:16:07
回答 1查看 91关注 0票数 2

1.摘要

我找不到Jinja2中if any() in object/if all() in object这样的表达式的正确语法是什么。

2. MCVE

  • 在Repl.it上的现场演示: “”Jinja2(如果有的话)在对象MCVE中。“”从jinja2导入模板KIRA_BLOCK = {% 14在范围(1,5)或4在范围(1,5)或7在范围(1,5) %}基拉女神!{% endif %}“打印(模板).render()

在没有重复代码的情况下,如何获得相同的结果?

3.没有帮助

  1. 我试着在Google,GitHub和Jinja文件中寻找我的问题的答案和类似的例子。
  2. 我不明白如何用Jinja内置过滤器来解决我的问题
  3. 我尝试了select()过滤器,就像堆栈溢出的这个答案中推荐的那样。如下所示: KIRA_BLOCK =“”{如果(14,4,7)\x{1,5) %} (1,5) %}基拉女神!{% endif %}“”
  4. 我尝试注册一个自定义的any()过滤器,就像在堆栈溢出的相同答案中推荐的那样。如下所示: “”Jinja2(如果有的话)在对象MCVE中。“”从jinja2导入环境jinja2导入模板环境= environment.filters" any“=any KIRA_BLOCK =”“{% if (14,4,7)区(14,4,7)\x{1,5) %} Kira女神!{% endif %}”打印模板(KIRA_BLOCK).render()

4.实例

预防XY问题

我在静态站点生成器鹈鹕中使用类似的模板。示例:

代码语言:javascript
复制
{# [INFO] If any of the classes "attention", "caution" or "warning" exists in my article, I add specific styles #}
{% if "class=\"attenion\"" in article.content or if "class=\"caution\"" in article.content or if "class=\"warning\"" in article.content %}
    <link rel="preload" href="path/to/css/third-party/Admonition/admonition-warning.min.css" as="style" onload="this.rel='stylesheet'">

{# [INFO] Elif all classes "faq", "help" and "question" exists in my article, I add another styles #}
{% elif "class=\"faq\"" in article.content and if "class=\"help\"" in article.content and if "class=\"question\"" in article.content %}
    <link rel="preload" href="path/to/css/third-party/Admonition/admonition-question.min.css" as="style" onload="this.rel='stylesheet'">
{% endif %}

我不明白如何从这些模板中删除硬编码。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-10 12:43:35

我找不到Jinja2中if any() in object/if any() in object这样的表达式的正确语法是什么。

在Python中,any()函数不是这样工作的。你可以这样写:

代码语言:javascript
复制
if any(value == 4 for value in mylist):
    ...

any()函数(如文献资料所示)等价于:

代码语言:javascript
复制
def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

不幸的是,上面的内容并没有很好地转化为Jinja,因为Jinja不支持列表/元组理解,没有它,any()函数就没有那么有用了。

看看你真正想做的事:

代码语言:javascript
复制
{#
   [INFO] If any of the classes "attention", "caution" or
  "warning" exists in my article, I add specific styles
#}
{% if "class=\"attenion\"" in article.content
     or if "class=\"caution\"" in article.content 
      or if "class=\"warning\"" in article.content %}
    <link rel="preload" href="path/to/css/third-party/Admonition/admonition-warning.min.css" as="style" onload="this.rel='stylesheet'">
{% endif %}

您可以注册如下所示的自定义has_class过滤器:

代码语言:javascript
复制
def has_class(content, classnames):
    return any(f'class="{name}"' in content for name in classnames)

像这样使用它:

代码语言:javascript
复制
{#
   [INFO] If any of the classes "attention", "caution" or
  "warning" exists in my article, I add specific styles
#}
{% if article.content|has_class(['attention', 'caution', 'warning']) %}
    <link rel="preload" href="path/to/css/third-party/Admonition/admonition-warning.min.css" as="style" onload="this.rel='stylesheet'">
{% endif %}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73670637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档