【问题标题】:Why doesn't my condition logic work as expected in Jinja2/CherryPy?为什么我的条件逻辑在 Jinja2/CherryPy 中没有按预期工作?
【发布时间】:2012-01-16 00:50:03
【问题描述】:
{% if bCat2 == True %}
    <div>True</div>
{% else %}
    <div>False</div>

即使bCat2True,也会返回&lt;div&gt;False&lt;/div&gt;。 谢谢, 安德鲁

【问题讨论】:

    标签: cherrypy jinja2


    【解决方案1】:

    这部分文档可以帮助您:

    特殊常量 true、false 和 none 确实是小写的。 因为这在过去引起了混乱,所以当写 True 扩展 到一个被认为是假的未定义变量,所有三个 也可以写成标题大小写(True、False 和 None)。然而对于 一致性(所有 Jinja 标识符都是小写的)你应该使用 小写版本

    来源:http://jinja.pocoo.org/docs/templates/

    试试那个代码:

    {% if bCat2 == true %}
    <div>True</div>
    {% else %}
    <div>False</div>
    {% endif %}
    

    【讨论】:

    • 这应该是正确的答案。如果列表很大并且我们希望将大列表发送到模板,则迭代一个大列表并将每个布尔值更改为字符串可能会变得昂贵。
    • 奇怪的是这对我不起作用...有更新吗?
    • 目前距离 Python 太远,无法更新。
    【解决方案2】:

    选项 1:最常见的解决方案

    像 python 一样解决这个问题。

    检查变量是否为真

    {% if bCat2 %}
        <div>True</div>
    {% else %}
        <div>False</div>
    

    检查变量是否为假

    {% if not bCat2 %}
        <div>False</div>
    {% else %}
        <div>True</div>
    

    Jinja2 If documentation

    选项 2:Jinja2 与解决方案相同

    像 jinja2 一样解决问题。 小心使用小写布尔值。

    检查变量是否为真

    {% if bCat2 is sameas true %}
        <div>True</div>
    {% endif %}
    

    检查变量是否为假

    {% if bCat2 is sameas false %}
        <div>False</div>
    {% endif %}
    

    Jinja2 sameas documentation

    【讨论】:

    • 对于那些对此感到困惑的人:当您将布尔变量放入 --extra-vars(of ansible-playbook) 时,不要这样做:--extra-vars="bCat2=True"。这是行不通的,因为命令行应用程序生成了一个字符串类型的 bCat2 var。最好在这里使用 json:--extra-vars='{ "bCat2": true }'.
    • 或者你可以给 var 一个空的 val,这将被解释为 false。像这样:--extra-vars='bCat2='
    【解决方案3】:

    在 Jinja2 中执行此操作的正确方法是:

    {% if bCat2 is sameas true %}
        <div>True</div>
    {% elif bCat2 is sameas false %}
        <div>False</div>
    {% endif %}
    

    你做不到的原因

    {% if bCat2 == true %}
    

    如果 bCat2 == 1 或 bCat2 == 1.0 它也将被认为是 True。

    【讨论】:

      【解决方案4】:

      要测试模板中的布尔变量,请将其转换为 Python 中的字符串

      str(bCat2)
      

      然后将其与模板中的字符串进行比较

      {% if bCat2 == 'True' %}
          <div>True</div>
      {% else %}
          <div>False</div>
      

      【讨论】:

      • 但是最好直接在 Jinja2 中比较,不用将布尔值转换为字符串,而不是 @Andrew?我认为@mrroot5 答案将是测试布尔值是真还是假的更容易和更好的方法。只是出于好奇,为什么有人要倾向于您提出的解决方案?
      【解决方案5】:

      我想补充一点,如果您的逻辑有点复杂,您可能需要了解范围。

      official documentation中所述:

      从 2.10 版开始,可以使用以下方式处理更复杂的用例 允许跨范围传播更改的命名空间对象:

      {% set ns = namespace(found=false) %}
      {% for item in items %}
          {% if item.check_something() %}
              {% set ns.found = true %}
          {% endif %}
          * {{ item.title }}
      {% endfor %}
      Found item having something: {{ ns.found }}
      

      【讨论】:

        【解决方案6】:

        拿这个:

        {% if bCat2 is true %}
            <div>True</div>
        {% else %}
            <div>False</div>
        {% endif %}
        

        我的测试:

        $ python -m pip install j2cli
        $ j2 <(echo "{% if false is true %}
            <div>True</div>
        {% else %}
            <div>False</div>
        {% endif %}")
        
            <div>False</div>
        
        $ j2 <(echo "{% if true is true %}
            <div>True</div>
        {% else %}
            <div>False</div>
        {% endif %}")
        
            <div>True</div>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-29
          • 2022-01-07
          • 2021-08-22
          • 2017-09-03
          • 2019-08-28
          相关资源
          最近更新 更多