【问题标题】:bad operand type for abs(): 'str' in djangoabs() 的错误操作数类型:django 中的“str”
【发布时间】:2012-12-16 17:41:12
【问题描述】:

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

我在{{ cart_sutotal|currency}} 行收到错误

【问题讨论】:

  • 您遇到了什么错误?
  • @Arpit:在 Q 的主题中;)

标签: django python-2.7 django-templates


【解决方案1】:

您的代码中某处缺少演员表。 无论您在代码中的哪个位置执行abs(somevar),您都需要通过执行abs(int(somevar)) 将字符串转换为整数。如果您发布堆栈跟踪或代码片段,则会获得更多信息。

【讨论】:

    【解决方案2】:

    来自python docs

    abs()

    返回一个数字的绝对值。参数可以是普通整数或长整数或浮点数。如果参数是复数,则返回其大小。

    引发的错误表明您将 str 参数传递给 abs() 方法,因为它期望选择上述参数。解决方案是将 integer 对象显式传递给 abs 方法。

    示例:

    >>>number = "1"
    >>>print abs(int(number))
    1
    >>>
    

    【讨论】:

      【解决方案3】:

      currency 过滤器期望它的参数是一个数值;您将一个字符串作为cart_sutotal 传递给您的模板。

      在将其传递给模板之前,将其转换为小数。十进制,或者,更好的是,弄清楚为什么要将价格值相加并为小计提供一个字符串。

      【讨论】:

        【解决方案4】:

        我认为您正在编写“开始 Django 电子商务”一书中的代码。 错误出现在您编写的代码中 {{ cart_sutotal|currency }} 代替 {{ cart_subtotal }}

        【讨论】:

          【解决方案5】:

          我记得那本书...您正在制作自定义模板过滤器,对吗?您需要将传入 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)
          

          【讨论】:

            猜你喜欢
            • 2017-05-27
            • 2014-01-02
            • 2021-06-18
            • 2015-09-21
            • 2021-01-15
            • 1970-01-01
            • 2013-03-28
            • 2017-10-13
            相关资源
            最近更新 更多