TypeError:类型' bool'的对象没有len() - Odoo v9社区

时间:2016-08-24 17:10:41

标签: python openerp odoo-9

我仍然在代码的另一部分出现此错误:

class invoice(models.Model):
_inherit = "account.invoice"

@api.multi
def send_xml_file(self):
    # haciendolo para efacturadelsur solamente por ahora
    host = 'https://www.efacturadelsur.cl'
    post = '/ws/DTE.asmx' # HTTP/1.1
    url = host + post
    _logger.info('URL to be used %s' % url)
    # client = Client(url)
    # _logger.info(client)
    _logger.info('len (como viene): %s' % len(self.sii_xml_request))

    response = pool.urlopen('POST', url, headers={
        'Content-Type': 'application/soap+xml',
        'charset': 'utf-8',
        'Content-Length': len(
            self.sii_xml_request)}, body=self.sii_xml_request)

    _logger.info(response.status)
    _logger.info(response.data)
    self.sii_xml_response = response.data
    self.sii_result = 'Enviado'

在我之前的question之前,错误已在此行中解决:

_logger.info('len (como viene): %s' % (len(self.sii_xml_request) if self.sii_xml_request else '')

现在我再次使用它了,我已经尝试过像以前一样的条件,但我仍然无法解决它,必须与语法或其他东西相关,错误就在这句话上:

        response = pool.urlopen('POST', url, headers={
        'Content-Type': 'application/soap+xml',
        'charset': 'utf-8',
        'Content-Length': len(
            self.sii_xml_request)}, body=self.sii_xml_request)

特别是在self.sii_xml_request)}, body=self.sii_xml_request)再次出现sii_xml_request对象时,我认为只需要添加条件,因为该字段为空...

但我仍然无法使其正常工作,这是否可以像我之前的问题一样解决?

提前致谢!

修改

这不是重复,因为这是另一行代码,并且一种非常类似的解决方法在这里不适用,它的语法略有不同。

第二次编辑

这就是它现在的样子,条件是这个函数的每个len

@api.multi
def send_xml_file(self):
    # haciendolo para efacturadelsur solamente por ahora
    host = 'https://www.efacturadelsur.cl'
    post = '/ws/DTE.asmx' # HTTP/1.1
    url = host + post
    _logger.info('URL to be used %s' % url)
    # client = Client(url)
    # _logger.info(client)
    _logger.info('len (como viene): %s' % len(self.sii_xml_request)if self.sii_xml_request else '')
    #if self.sii_xml_request:
    response = pool.urlopen('POST', url, headers={
        'Content-Type': 'application/soap+xml',
        'charset': 'utf-8',
        'Content-Length': (len(
            self.sii_xml_request) if self.sii_xml_request else '')}, body=self.sii_xml_request)
    #else ''(len(self.sii_xml_request) if self.sii_xml_request else '') 

    _logger.info(response.status)
    _logger.info(response.data)
    self.sii_xml_response = response.data
    self.sii_result = 'Enviado'

2 个答案:

答案 0 :(得分:1)

为了避免在评论中拖动对话,我将对实际答案进行分析。

您的对象self.sii_xml_request似乎可以是a)。一个字符串,或b)。布尔值(TrueFalse)(但如果我错了请纠正我。)

您收到错误,因为您尝试使用该对象的len()来了解请求的长度,但是当该对象为True或{{1}时这将失败,因为False个对象没有bool属性。您尝试通过执行此操作来解决此问题:

__len__

仅当(len(self.sii_xml_request) if self.sii_xml_request else '') 仅返回字符串或self.sii_xml_request(或类似于False的内容,例如FalseNone或{ {1}}等等,因为如果它返回0,那么它将再次尝试获取不起作用的对象的[]

这样做的:

True

可能会有效,但我不知道是什么决定len()是返回(len(self.sii_xml_request) if self.sii_xml_request is not True or False else '') self.sii_xml_request还是某些字符串,您可能想要处理True和{{ 1}}不同。此外,您可能永远不希望内容长度为False,因为它通常是一个整数,因此,如果TrueFalse,您应该''。如果您想要处理它们,请尝试上面的内容。否则,您可以提前定义变量0,并根据self.sii_xml_request的值进行相应设置。例如:

False

答案 1 :(得分:1)

当你在消息中得到'bool'这意味着你在空字段上调用一个函数时,这种错误,所以在你调用任何函数之前检查字段是否具有值。因为在odoo空字段中包含False值而不是每次我发现我在空字段上调用函数时多次出现此错误