【问题标题】:Django template ifequal comparison of decimalsDjango模板ifequal比较小数
【发布时间】:2010-10-01 09:57:03
【问题描述】:

所以,我有一个可以是 3 个不同值的小数域。在我看来, 我传入一个包含适当小数的值字典 值作为键。

{% for item in booklist %}  
    {% for key, value in numvec.items %}  
        {{item.number}}  
        {% ifequals item.number {{key}} %}  
            {{value}}  
        {% endifequals %}  
    {% endfor %}
{% endfor %}

这是我作为 numvec 传入的字典:

numvec = {"TEST":Decimal("0.999"), "TEST2":Decimal("0.500"),

"TEST3":Decimal("0.255")}

数字字段在我的模型中被定义为具有这些选项:

BOOK_CHOICES=((Decimal("0.999"), 'TEST'),(Decimal("0.500"), 'TEST2'),(Decimal("0.255"), 'TEST3'),)

如果我比较字典,项目编号在视图中打印得很好 具有该属性,但由于某种原因 ifequals 不能正确 比较两个小数。这是一个错误,还是我在做什么 ifequals 在我的模板中出错了?

【问题讨论】:

  • 这可能是一个错误。但是 OTOH 小数对于键来说是一个糟糕的选择。 stackoverflow.com/search?q=python+decimal
  • 我也不知道你想用那个模板完成什么。您能否详细说明该示例。还请缩进您的代码片段以使其适当突出显示。 stackoverflow.com/editing-help
  • 因此,在我的示例中,numvec 是用于某些数值计算的值。在呈现读书报告时,我想在模板中显示“TEST”、“TEST2”等,而不是原始十进制值,因为这对阅读报告的人来说更有价值。

标签: python django django-templates


【解决方案1】:

根据this,您似乎只能比较字符串。如果我是你,我会创建自己的template tag

【讨论】:

  • 你确定吗?它说“只能将参数与 模板变量 或字符串进行比较。”,我强调了这一点。
【解决方案2】:

最简单的解决方案是在模型上定义一个方法,封装数字逻辑,返回人性化的字符串。

或者你可以写一个模板标签来做,这需要更多的代码,但可能更好地保留模型/视图层的分离。

【讨论】:

    【解决方案3】:

    尚不清楚这是否会对 Ardesco 有所帮助,但 template_utilsif_greaterif_greater_or_equalif_lessif_less_or_equal 标签(以及其他标签)解决了非常相关的案例,其中一个普通的 @987654326 @ 还不够。

    安装后只需在INSTALLED_APPS 下添加template_utils 执行您的django settings.py,然后将{% load comparison %} 放入您的模板中

    【讨论】:

      【解决方案4】:

      这不是错误,有可能实现您想要做的事情。

      但是,首先要对您的代码进行一些评论:

      • 没有“ifequals/endifequals”运算符。您可以使用"ifequal/endifequal""if/endif"
      • 第二件事。如果您在“ifequal”或“if”运算符内留下双花括号,您的代码 {% ifequal item.number {{key}} %} 将导致 TemplateSyntaxError 异常。

      现在解决办法

      1. 只需使用"stringformat" 过滤器即可将十进制值转换为字符串。
      2. 在运算符中使用变量时跳过大括号。
      3. 不要忘记“if”或“ifequal”运算符中的变量始终表示为字符串。

      这是一个示例

      {% for item in decimals %}  
        {% if item|stringformat:"s" == variable %}  
          {{ variable }}
        {% endif %}  
      {% endfor %}
      

      【讨论】:

      • 我显然需要比较一个 int 和一个字符串,这正是我所需要的。谢谢
      【解决方案5】:

      解决办法:

      {% for item in decimals %}  
        {% if item|stringformat:"s" == variable %}  
          {{ variable }}
        {% endif %}  
      {% endfor %}
      

      非常适合将小数(如循环)与字符串(如传递的值)进行比较

      【讨论】:

        【解决方案6】:

        相比之下,像 1.1 和 2.2 这样的数字在二进制浮点中没有精确的表示。 >>

        例如如果你

        print Decimal(3.59)
        

        你得到

        3.589999999999999857891452847979962825775146484375
        

        因此,如果您在 django 模板中比较两个小数,最好使用@Oleg Sakharov 的答案,或者您可以使用相同的方法但不同的格式字符串,例如:

        if item|stringformat:".2f" == "3.59"
        

        【讨论】:

          猜你喜欢
          • 2015-04-09
          • 2011-01-07
          • 2017-12-29
          • 2011-11-22
          • 2013-11-29
          • 2012-02-23
          • 2018-09-25
          • 2010-11-07
          • 2019-01-19
          相关资源
          最近更新 更多