【问题标题】:Multiply by -1 in a Django template在 Django 模板中乘以 -1
【发布时间】:2013-04-02 18:48:36
【问题描述】:

我想在 Django 模板中始终使用我的变量的正值。变量的符号只是文字含义:

{% if qty > 0 %}
  Please, sell {{ qty }} products.
{% elif qty < 0 %}
  Please, buy {{ -qty }} products.
{% endif %}

当然,{{ -qty }} 不起作用。

是否有不传递包含绝对值的第二个变量的解决方法?类似于将值转换为无符号整数的模板过滤器。

谢谢!

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    与 Python 中的 everything 一样,有一个库:django-mathfilters

    然后您可以像这样简单地使用abs 过滤器:

    Please, sell {{ qty|abs }} products.
    

    【讨论】:

    • django-mathfilters 似乎有了一个新家,here。无法将血统追溯到原始项目,而且它似乎没有在 PyPi 上更新......但仍然是一个很好的参考和 MIT 许可证。
    【解决方案2】:

    你可以滥用一些字符串过滤器:

    {% if qty > 0 %}
      Please, sell {{ qty }} products.
    {% elif qty < 0 %}
      Please, buy {{ qty|slice:"1:" }} products.
    {% endif %}
    

     Please, sell {{ qty|stringformat:"+d"|slice:"1:" }} products.
    

    但您可能应该在您的视图中执行此操作或编写自定义过滤器。

    【讨论】:

    • 谢谢,看来这就是我要找的东西!我可以使用自定义过滤器(但我更喜欢“滥用”Django 的过滤器),但我不喜欢在视图中做更多事情的想法。在我看来,视图已经完成了逻辑,渲染文本含义是模板的工作(也许我想要两种情况下不同的 HTML 代码)。另外,不显示数字符号只是格式化,而不是计算。但很遗憾,我们不能使用stringformat:"u" 来执行此操作。
    【解决方案3】:

    您应该为此使用自定义过滤器。

    这里有两种不同的方法:

    1) 你可以定义一个negate 过滤器:

    # negate_filter.py
    from django import template
    register = template.Library()
    
    @register.filter
    def negate(value):
        return -value
    

    然后在您的模板中,将代码{% load negate_filter %} 添加到顶部,然后将{{ -qty }} 替换为{{ qty|negate }}

    2) 如果您愿意,也可以用一个 buy_sell 过滤器替换整个内容:

    # buy_sell_filter.py
    from django import template
    register = template.Library()
    
    @register.filter
    def buy_sell(value):
        if value > 0 :
          return 'sell %s' % value
        else :
          return 'buy %s' % -value
    

    那么你的模板应该是

    {% if qty %} Please, sell {{ qty|buy_sell }} products.{% endif %}
    

    您甚至可以在过滤器中包含整个字符串,然后将整个模板设为 {{ qty|buy_sell }}。

    这两个选项都是合理的,具体取决于模板的其余部分。例如,如果您有很多使用负数买入和正数卖出的字符串,请执行第二个。

    【讨论】:

      【解决方案4】:

      理想情况下,您应该在视图中执行检查,以将逻辑与显示分开(例如,如果 qty = 0 会发生什么?) 如果您坚持在模板中进行数学运算,则可以执行this hack 之类的操作。

      另一种选择是编写自定义过滤器(请参阅this example)。

      【讨论】:

      • qty = 0 的案例当然包含在原始模板中,但为简单起见,此处未显示。我不喜欢在我看来写更多东西的想法,因为我认为它有逻辑,并以非常简洁的方式传递结果。如果明天我想为这两种情况使用不同的 HTML 样式,我认为不应该在视图中完成!
      • 很公平。在这种情况下,我建议您编写自己的模板过滤器,正如其他一些答案所建议的那样。它只需要几行代码,就可以在所有模板中轻松实现此功能。
      猜你喜欢
      • 2013-11-04
      • 2013-08-22
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2012-01-27
      • 2021-03-23
      相关资源
      最近更新 更多