Python Django模板ifequal小数比较
所以,我有一个十进制字段,可以是3个不同的值。在我看来,, 我传入一个包含适当小数点的值字典 值作为键Python Django模板ifequal小数比较,python,django,django-templates,Python,Django,Django Templates,所以,我有一个十进制字段,可以是3个不同的值。在我看来,, 我传入一个包含适当小数点的值字典 值作为键 {% for item in booklist %} {% for key, value in numvec.items %} {{item.number}} {% ifequals item.number {{key}} %} {{value}} {% endifequals %}
{% 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'),)
如果我比较dict,则项目编号在视图中打印得很好
属性,但由于某些原因,ifequals无法正确
比较两个小数。这是一只虫子,还是我在做什么
ifequals在我的模板中出错 根据,您似乎只能比较字符串。如果我是你,我会做我自己的 根据,您似乎只能比较字符串。如果我是你,我会做我自己的 最简单的解决方案是在模型上定义一个方法,该方法封装数字逻辑并返回人性化字符串
或者您可以编写一个模板标记来完成此操作,这需要编写更多的代码,但可能会更好地保留模型/视图层的分离。最简单的解决方案是在模型上定义一个方法,该方法封装数字逻辑并返回人性化字符串
或者您可以编写一个模板标记来完成这项工作,这需要编写更多的代码,但可能会更好地保留模型/视图层分离。这是否有助于Ardesco,还不太清楚,但有一些标记有
如果大于
,如果大于或等于
,如果小于
,如果小于或等于
等它解决了一些非常相关的情况,其中简单的ifequals
是不够的
安装后,只需添加
template\u utils
在已安装的应用程序下执行django settings.py,然后将{%load comparison%}
放在模板中不太清楚这是否有助于Ardesco,但有如果大于,如果大于或等于,如果小于,if_less_或_equal
标记(以及其他标记),用于解决简单的ifequals
不够的相关情况
安装后,只需添加template\u utils
在INSTALLED\u APPS
下执行django settings.py,然后将{%load comparison%}
放在模板中这不是一个bug,有可能实现您的目标
但是,首先要对您的代码说几句话:
- 没有“ifequals/endifequals”运算符。你要么使用,要么使用
- 第二件事。如果在“ifequal”或“if”运算符中保留双花括号,则代码
{%ifequal item.number{{{key}}}%}
将导致TemplateSyntaxError异常
现在解决方案是:
只需使用过滤器将十进制值转换为字符串即可
在运算符中使用变量时跳过花括号
不要忘记“if”或“ifequal”运算符中的变量始终表示为字符串
以下是一个例子:
这不是一个bug,实现您想要做的事情是可能的
但是,首先要对您的代码说几句话:
- 没有“ifequals/endifequals”运算符。你要么使用,要么使用
- 第二件事。如果在“ifequal”或“if”运算符中保留双花括号,则代码
{%ifequal item.number{{{key}}}%}
将导致TemplateSyntaxError异常
现在解决方案是:
只需使用过滤器将十进制值转换为字符串即可
在运算符中使用变量时跳过花括号
不要忘记“if”或“ifequal”运算符中的变量始终表示为字符串
以下是一个例子:
解决方案:
{% for item in decimals %}
{% if item|stringformat:"s" == variable %}
{{ variable }}
{% endif %}
{% endfor %}
将十进制(如循环)与字符串(如传递的值)进行比较非常有效。解决方案:
{% for item in decimals %}
{% if item|stringformat:"s" == variable %}
{{ variable }}
{% endif %}
{% endfor %}
比较十进制(如循环)和字符串(如传递的值)非常有效。相反,像1.1和2.2这样的数字在二进制浮点中没有精确的表示形式
如果你
print Decimal(3.59)
你得到
3.589999999999999857891452847979962825775146484375
因此,如果比较django模板中的两个小数,最好使用@Oleg Sakharov的答案,或者也可以使用相同的方法但格式不同的字符串,如:
if item|stringformat:".2f" == "3.59"
相反,像1.1和2.2这样的数字在二进制浮点中没有精确的表示
如果你
print Decimal(3.59)
你得到
3.589999999999999857891452847979962825775146484375
因此,如果比较django模板中的两个小数,最好使用@Oleg Sakharov的答案,或者也可以使用相同的方法但格式不同的字符串,如:
if item|stringformat:".2f" == "3.59"
这可能是个bug。但对于键来说,OTOH小数是一个糟糕的选择。另外,我也不知道你想用这个模板完成什么。你能详细说明一下这个例子吗。另外,请缩进您的代码snipplet,使其适当突出显示。因此,在我的示例中,numvec是一个用于某些数值计算的值。在展示图书报告时,我想在模板中显示“TEST”、“TEST2”等,而不是原始的十进制值,因为这对阅读报告的人更有价值。这可能是一个bug。但对于键来说,OTOH小数是一个糟糕的选择。另外,我也不知道你想用这个模板完成什么。你能详细说明一下这个例子吗。另外,请缩进您的代码snipplet,使其适当突出显示。因此,在我的示例中,numvec是一个用于某些数值计算的值。在展示图书报告时,我想在模板中显示“TEST”、“TEST2”等,而不是原始的十进制值,因为这对阅读报告的人来说更有价值。你确定吗?它说“只能将参数与模板变量或字符串进行比较。”我的重点补充道。你确定吗?它说“只能将参数与模板变量或字符串进行比较。”