Django模板ifequal比较小数

时间:2009-01-14 16:27:22

标签: python django django-templates

所以,我有一个十进制字段,可以是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”:十进制( “0.255”)}

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

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

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

6 个答案:

答案 0 :(得分:11)

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

然而,首先是关于你的代码的几点评论:

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

现在的解决方案

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

解决方案:

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

适用于将小数(如循环)与字符串(如传递值)进行比较

答案 3 :(得分:0)

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

或者您可以编写模板标签来执行此操作,这是更多的代码,但可能会更好地保留模型/视图层分离。

答案 4 :(得分:0)

目前尚不清楚这是否有助于Ardesco,但template_utilsif_greaterif_greater_or_equalif_lessif_less_or_equal标签(等等)这解决了普通ifequals不够的非常相关的情况。

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

答案 5 :(得分:0)

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

E.g。如果你

print Decimal(3.59)

你得到了

3.589999999999999857891452847979962825775146484375

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

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