【发布时间】:2012-12-16 17:41:12
【问题描述】:
我正在浏览购物车应用程序的初始 django 电子商务应用程序。单击添加到购物车按钮时,我收到上述错误。
我在{{ cart_sutotal|currency}} 行收到错误
【问题讨论】:
-
您遇到了什么错误?
-
@Arpit:在 Q 的主题中;)
标签: django python-2.7 django-templates
我正在浏览购物车应用程序的初始 django 电子商务应用程序。单击添加到购物车按钮时,我收到上述错误。
我在{{ cart_sutotal|currency}} 行收到错误
【问题讨论】:
标签: django python-2.7 django-templates
您的代码中某处缺少演员表。
无论您在代码中的哪个位置执行abs(somevar),您都需要通过执行abs(int(somevar)) 将字符串转换为整数。如果您发布堆栈跟踪或代码片段,则会获得更多信息。
【讨论】:
来自python docs。
abs()
返回一个数字的绝对值。参数可以是普通整数或长整数或浮点数。如果参数是复数,则返回其大小。
引发的错误表明您将 str 参数传递给 abs() 方法,因为它期望选择上述参数。解决方案是将 integer 对象显式传递给 abs 方法。
>>>number = "1"
>>>print abs(int(number))
1
>>>
【讨论】:
currency 过滤器期望它的参数是一个数值;您将一个字符串作为cart_sutotal 传递给您的模板。
在将其传递给模板之前,将其转换为小数。十进制,或者,更好的是,弄清楚为什么要将价格值相加并为小计提供一个字符串。
【讨论】:
我认为您正在编写“开始 Django 电子商务”一书中的代码。
错误出现在您编写的代码中 {{ cart_sutotal|currency }} 代替 {{ cart_subtotal }} 。
【讨论】:
我记得那本书...您正在制作自定义模板过滤器,对吗?您需要将传入 locale.currency 的值从字符串转换为 int/decimal/float。
避免货币舍入错误的最佳做法是使用decimal 包。
导入十进制包并通过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)
【讨论】: