1

所以,我有一个可以是 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”)}

number 字段在我的模型中被定义为具有以下选择:

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

如果我将 dict 与属性进行比较,则项目编号在视图中打印得很好,但由于某种原因,ifequals 无法正确地将两个小数比较在一起。这是一个错误,还是我在使用 ifequals 的模板中做错了什么?

4

6 回答 6

11

这不是一个错误,它可以实现你想要做的事情。

但是,首先,关于您的代码的一些评论:

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

现在解决方案

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

这是一个例子

{% for item in decimals %}  
  {% if item|stringformat:"s" == variable %}  
    {{ variable }}
  {% endif %}  
{% endfor %}
于 2010-04-15T10:25:19.493 回答
2

据此您似乎只能比较字符串。如果我是你,我会制作自己的模板标签。

于 2009-01-14T18:30:24.383 回答
2

解决方案:

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

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

于 2010-07-29T08:21:57.383 回答
0

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

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

于 2009-01-15T19:30:01.003 回答
0

目前还不太清楚这是否会对 Ardesco 有所帮助,但是template_utilsif_greater, if_greater_or_equal, if_less,if_less_or_equal标记(以及其他)可以解决非常相关的情况,即普通ifequals的还不够。

安装后只需添加template_utils你的 django settings.py INSTALLED_APPS,然后放入{% load comparison %}你的模板

于 2009-06-16T04:05:00.983 回答
0

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

例如,如果你

print Decimal(3.59)

你得到

3.589999999999999857891452847979962825775146484375

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

if item|stringformat:".2f" == "3.59"
于 2014-11-05T23:05:36.160 回答