类型错误:“bool”类型的对象没有len()Odoo v9 community

2024-05-14 04:10:44 发布

您现在位置:Python中文网/ 问答频道 /正文

代码的另一部分仍有此错误:

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中,错误已在以下行中解决:

^{pr2}$

现在我在下一个问题上又讲了一遍,我像以前一样试过一个条件句,但是我还是解决不了,一定是跟语法有关什么的,错误就在这个句子上:

        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'

Tags: selfinfoclienthosturllenresponserequest
2条回答

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

为了避免在评论中拖沓谈话,我将对一个实际的答案进行分析。在

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

您得到了一个错误,因为您试图获取该对象的len()来了解请求的长度,但是当该对象是True或{}时,这将失败,因为bool对象没有__len__属性。您尝试根据上一个问题来解决此问题,方法是:

(len(self.sii_xml_request) if self.sii_xml_request else '')

只有当self.sii_xml_request只返回一个字符串或False(或与None0或{}等等价的东西)时,True才会起作用,因为如果它返回True,那么它将再次尝试获取不起作用的对象的len()。在

正在做:

^{pr2}$

可能有用,但我不知道是什么决定了self.sii_xml_request返回TrueFalse还是某些字符串,您可能希望用不同的方式处理True和{}。另外,您可能永远不希望内容长度是'',因为它通常是一个整数,所以如果有任何东西,您应该将它设置为0,如果{}是{}。如果你想用同样的方法处理它们,试试我上面的方法。否则,您可以在前面定义一个变量content_length,并根据self.sii_xml_request的值相应地设置它。例如:

if isinstance(self.sii_xml_request, bool):
    content_lengthj == int(self.sii_xml_request)  # 1 if True else 0
else:
    content_length = len(self.sii_xml_request)

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

相关问题 更多 >