如何解决“类型错误:浮置()参数必须是一个字符串或数字”(How to resolve “TypeE

2019-09-27 10:40发布

我试图安装模块product_print_zpl_barcode在odoo 9.本模块用于增加产品变型向导生成和ZPL打印机上打印产品条形码。 我得到的错误:

类型错误:浮子()参数必须是字符串或数字

当我按下按钮“打印条形码”。

这里是源代码和错误:

product_print_zpl_barcode.py

 # -*- coding: utf-8 -*-

 from openerp import models, fields, api, _
 from openerp.exceptions import UserError
 from openerp.tools import float_compare, float_is_zero
 import openerp.addons.decimal_precision as dp
 import base64
 import re


 class ProductPrintZplBarcode(models.Model):
_name = 'product.print.zpl.barcode'
_description = 'Generate and print product barcodes in ZPL'

@api.depends('pricelist_id', 'quantity', 'product_id')
def _compute_price(self):
    # for regular barcodes
    for wiz in self:
        if wiz.pricelist_id and wiz.product_id:
            price_uom = wiz.pricelist_id.price_get(wiz.product_id.id, 1)
            wiz.price_uom = price_uom
            wiz.price = price_uom * wiz.quantity
    return wiz.price

追溯

   Traceback (most recent call last):
 File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 650, in _handle_exception
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 687, in dispatch
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 323, in _call_function
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\service\model.py", line 118, in wrapper
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 316, in checked_call
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 966, in __call__
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 516, in response_wrap
File "D:\Projet_Odoo\Odoo 9.20180426\server\openerp\addons\web\controllers\main.py", line 896, in call_kw
File "D:\Projet_Odoo\Odoo 9.20180426\server\openerp\addons\web\controllers\main.py", line 888, in _call_kw
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\api.py", line 250, in wrapper
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\api.py", line 381, in old_api
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\models.py", line 6067, in onchange
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\models.py", line 5770, in __getitem__
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 834, in __get__
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 949, in determine_draft_value
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 895, in compute_value
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 885, in _compute_value
File "D:\Projet_Odoo\Odoo 9.020180426\server\openerp\addons\product_print_zpl_barcode\models\product_print_zpl_barcode.py", line 100, in _compute_price
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 847, in __set__
File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 1177, in convert_to_cache
TypeError: float() argument must be a string or a number

Answer 1:

不返回任何值。

作为Odoo网站所描述You should assign the computed value to the field

计算领域

字段可以计算使用计算参数(而不是从所述数据库直读)。 它必须将计算价值的领域。 如果使用其他字段的值,就应该使用取决于指定这些字段()

评估后price_uom = wiz.pricelist_id.price_get(wiz.product_id.id, 1)

price_uom将是一个字典( {pricelist_id: price} ),所以你需要尝试执行任何算术运算之前得到price_uom。

@api.depends('pricelist_id', 'quantity', 'product_id')
def _compute_price(self):
    # for regular barcodes
    for wiz in self:
        if wiz.pricelist_id and wiz.product_id:
            # You need to get price from the dict using pricelist_id
            price_uom = wiz.pricelist_id.price_get(wiz.product_id.id, 1)[wiz.pricelist_id.id]
            wiz.price_uom = price_uom
            wiz.price = price_uom * wiz.quantity
    return wiz.price

你可以看到如何price_get如果你看看下面的代码返回值来计算(我只是复制所需的最低代码):

def price_get(self, cr, uid, ids, prod_id, qty, partner=None, context=None):
    return dict((key, price[0]) for key, price in self.price_rule_get(cr, uid, ids, prod_id, qty, partner=partner, context=context).items())

def price_rule_get(self, cr, uid, ids, prod_id, qty, partner=None, context=None):
    product = self.pool.get('product.product').browse(cr, uid, prod_id, context=context)
    res_multi = self.price_rule_get_multi(cr, uid, ids, products_by_qty_by_partner=[(product, qty, partner)], context=context)
    res = res_multi[prod_id]
    return res

def price_rule_get_multi(self, cr, uid, ids, products_by_qty_by_partner, context=None):
    """multi products 'price_get'.
        @param ids:
        @param products_by_qty:
        @param partner:
        @param context: {
            'date': Date of the pricelist (%Y-%m-%d),}
        @return: a dict of dict with product_id as key and a dict 'price by pricelist' as value
    """
    if not ids:
        ids = self.pool.get('product.pricelist').search(cr, uid, [], context=context)
    results = {}
    for pricelist in self.browse(cr, uid, ids, context=context):
        subres = self._price_rule_get_multi(cr, uid, pricelist, products_by_qty_by_partner, context=context)
        for product_id, price in subres.items():
            results.setdefault(product_id, {})
            results[product_id][pricelist.id] = price
    return results


文章来源: How to resolve “TypeError: float() argument must be a string or a number”