我正在浏览购物车应用程序的django电子商务应用程序。单击添加到购物车按钮时,我收到上述错误。
我在第{{ cart_sutotal|currency}}
行
答案 0 :(得分:2)
我记得那本书......您正在制作自定义模板过滤器吗?您需要将传递给locale.currency的值从字符串转换为int / decimal / float。
避免使用货币舍入错误的最佳做法是使用十进制包。 导入十进制包并通过Decimal函数传递您的值以解决问题。
from decimal import Decimal
value = Decimal(value)
所以你的代码应该是这样的:
from django import template
import locale
from decimal import Decimal
register = template.Library()
@register.filter(name='currency')
def currency(value):
try:
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')
except:
locale.setlocale(locale.LC_ALL,'')
value =Decimal(value)
loc = locale.localeconv()
return locale.currency(value, loc['currency_symbol'], grouping=True)
答案 1 :(得分:1)
来自python docs。
<强> ABS()强>
返回数字的绝对值。参数可以是普通或长整数或浮点数。如果参数是一个复数,则返回其大小。
引发的错误表明您正在将str
参数传递给abs()
方法,因为它期望选择上述参数。解决方案是将integer
对象显式传递给abs方法。
>>>number = "1"
>>>print abs(int(number))
1
>>>
答案 2 :(得分:1)
currency
过滤器期望其参数为数值;您将字符串作为cart_sutotal
传递给模板。
在将其传递给模板之前,将其转换为decimal.Decimal,或者更好地找出为什么要将价格值相加并为小计提供字符串。
答案 3 :(得分:0)
您在代码中的某个地方缺少演员。
在您正在执行的代码abs(somevar)
中的任何位置,您需要通过执行abs(int(somevar))
将字符串转换为整数。更多信息,如果您发布堆栈跟踪或代码片段。
答案 4 :(得分:0)
我认为你正在编写“开始Django电子商务”一书的代码。 您在代码{{cart_sutotal | currency}}代替{{cart_subtotal}}的代码中出现错误。