abs()的坏操作数类型:django中的'str'

时间:2013-01-02 10:43:43

标签: django python-2.7 django-templates

我正在浏览购物车应用程序的django电子商务应用程序。单击添加到购物车按钮时,我收到上述错误。

我在第{{ cart_sutotal|currency}}

收到错误

5 个答案:

答案 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}}的代码中出现错误。