【问题标题】:How to solve this error: 'product.template' has no attribute 'generate_ean13'?如何解决此错误:“product.template”没有属性“generate_ean13”?
【发布时间】:2018-05-07 16:19:16
【问题描述】:

我正在使用 Odoo 9,并且我创建了一个用于生成产品条形码的自定义模块。我在产品模板表单中创建了一个自定义按钮,该按钮生成一个条形码并将其插入字段barcode。但每次我按下“生成 ean13”按钮时,都会显示此错误,我不知道该怎么做。这是我的代码:

product_view.xml

<odoo>
    <record id="view_product_category_simple_ean_form" model="ir.ui.view">
        <field name="name">product.category.form</field>
        <field name="model">product.category</field>
        <field name="inherit_id" ref="product.product_category_form_view" />
        <field name="arch" type="xml">
            <field name="type" position="after">
                <field name="ean_sequence_id" domain="[('barcode_sequence', '=', 1)]"
                    context="{'default_name': name and 'EAN ' + name or 'EAN', 'default_barcode_sequence': 1}" />
                <newline />
            </field>
        </field>
    </record>

    <record id="view_product_simple_ean_form" model="ir.ui.view">
        <field name="name">product.template.product.form.barcode</field>
        <field name="model">product.template</field>
        <field name="inherit_id" ref="product.product_template_only_form_view" />
        <field name="arch" type="xml">
            <field name="barcode" position="after">    
                <button string="Generate the EAN13" name="generate_ean13"
                    attrs="{'invisible': [('barcode', '!=', False)]}"
                    type="object" colspan="2" />
            </field>
        </field>
    </record>
</odoo>

product.py

from openerp import api, models, fields, _
from openerp  import exceptions


def isodd(x):
    return bool(x % 2)


class ProductCategory(models.Model):
    _inherit = 'product.category'

    ean_sequence_id = fields.Many2one('ir.sequence', string='Ean sequence')


class ProductTemplate(models.Model):
    _inherit = 'product.template'

    barcode = fields.Char(copy=False)
    ean= fields.Char(copy=False)

    _columns = {
        ean_sequence_id: fields.Many2one('ir.sequence', string='Ean sequence')
    }


    @api.model
    def _get_ean_next_code(self, product):
        sequence_obj = self.env['ir.sequence']
        if product.ean_sequence_id:
            ean = sequence_obj.next_by_id(product.ean_sequence_id.id)
        elif product.categ_id.ean_sequence_id:
            ean = sequence_obj.next_by_id(product.categ_id.ean_sequence_id.id)
        elif product.company_id and product.company_id.ean_sequence_id:
            ean = sequence_obj.next_by_id(
                product.company_id.ean_sequence_id.id)
        elif self.env.context.get('sequence_id', False):
            ean = sequence_obj.next_by_id(self.env.context.get('sequence_id'))
        else:
            return None
        ean = (len(ean[0:6]) == 6 and ean[0:6] or
            ean[0:6].ljust(6, '0')) + ean[6:].rjust(6, '0')
        if len(ean) > 12:
            raise exceptions.Warning(
                _("Configuration Error!"
                "The next sequence is longer than 12 characters. "
                "It is not valid for an EAN13 needing 12 characters, "
                "the 13 being used as a control digit"
                "You will have to redefine the sequence or create a new one")
                )

        return ean

    def _get_ean_control_digit(self, code):
        sum = 0
        for i in range(12):
            if isodd(i):
                sum += 3 * int(code[i])
            else:
                sum += int(code[i])
        key = (10 - sum % 10) % 10
        return '%d' % key

    @api.model
    def _generate_ean13_value(self, product):
        ean = self._get_ean_next_code(product)
        if not ean:
            return None
        key = self._get_ean_control_digit(ean)
        barcode = ean + key
        return barcode

    @api.one
    def generate_ean13(self):
        if not self.barcode:
            barcode = self._generate_ean13_value(self)
            if barcode:
                self.write({'barcode': barcode})

    return True

我的回溯

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.0- 
20180426\server\openerp\addons\web\controllers\main.py", line 900, in 
call_button
File "D:\Projet_Odoo\Odoo 9.0- 
20180426\server\openerp\addons\web\controllers\main.py", line 888, in 
_call_kw
 AttributeError: 'product.template' object has no attribute 'generate_ean13'

【问题讨论】:

    标签: python xml python-2.7 odoo odoo-9


    【解决方案1】:

    我发现了几个错误

    首先,不要使用_columns 字典,这是在旧的api 中使用的。所以像这样声明字段ean_sequence_id

    ean_sequence_id = fields.Many2one(
        string='Ean sequence',
        comodel_name='ir.sequence',
    )
    

    按钮调用的方法应该有一个@api.multi装饰器:

    @api.multi
    def generate_ean13(self):
        for record in self:
            if not record.barcode:
                barcode = record._generate_ean13_value(record)
                if barcode:
                    record.write({'barcode': barcode})
    

    【讨论】:

    • 谢谢,但即使进行了此修改,它也会显示相同的错误
    • 你能在你的问题中显示整个错误堆栈跟踪吗?
    • 奇怪的问题:但是您是否导入了模板扩展? (__init__.py)
    猜你喜欢
    • 2022-07-12
    • 2019-08-11
    • 1970-01-01
    • 2019-09-08
    • 2020-10-25
    • 2022-01-16
    • 1970-01-01
    • 2021-05-24
    • 2019-08-19
    相关资源
    最近更新 更多