You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Odoo 9中‘product.template’无‘generate_ean13’属性错误?

看起来你遇到的问题很典型——按钮点击时找不到对应的模型方法,我帮你一步步排查解决:

核心问题分析

报错'product.template' has no attribute 'generate_ean13'说明Odoo找不到你在按钮里调用的这个方法,大概率是模型没定义方法、视图配置错误或者继承关系不对这几个原因。

第一步:检查模型文件是否正确实现了方法

首先你需要在自定义模块的模型文件(比如product.py)里继承product.template,并定义generate_ean13方法,代码示例如下:

from openerp import models, fields, api

class ProductTemplate(models.Model):
    _inherit = 'product.template'  # 必须继承原产品模板模型

    @api.multi  # Odoo9中多记录操作用这个装饰器
    def generate_ean13(self):
        # 遍历选中的产品模板(支持批量操作)
        for product in self:
            # 这里写你的EAN13生成逻辑,下面是基础实现示例
            # 生成12位随机基础码,再计算第13位校验位
            import random
            base_code = ''.join(str(random.randint(0,9)) for _ in range(12))
            # 计算EAN13校验位
            odd_sum = sum(int(base_code[i]) for i in range(0, 12, 2))
            even_sum = sum(int(base_code[i]) for i in range(1, 12, 2))
            total = odd_sum * 3 + even_sum
            check_digit = (10 - (total % 10)) % 10
            new_ean = base_code + str(check_digit)
            
            # 把生成的条形码赋值给barcode字段
            product.barcode = new_ean

第二步:修正视图文件的配置

从你给出的xml代码片段看,你可能继承错了视图!你写的是product.category.form(产品分类的视图),但你要修改的是**产品模板(product.template)**的表单视图,所以正确的视图继承应该是这样:

<odoo>
    <record id="view_product_template_ean_form_inherit" model="ir.ui.view">
        <field name="name">product.template.form.ean.inherit</field>
        <field name="model">product.template</field>
        <!-- 继承Odoo原生的产品模板表单视图 -->
        <field name="inherit_id" ref="product.product_template_form_view"/>
        <field name="arch" type="xml">
            <!-- 把按钮插入到barcode字段后面,位置可按需调整 -->
            <field name="barcode" position="after">
                <button 
                    name="generate_ean13" 
                    string="Generate the ean13" 
                    type="object"  <!-- 必须是object类型,才会调用模型方法 -->
                    class="oe_highlight"
                />
            </field>
        </field>
    </record>
</odoo>

这里要注意几个关键点:

  • model必须是product.template,和你要操作的模型一致
  • inherit_id要指向原生产品模板的视图product.product_template_form_view
  • 按钮的type是object,这样点击时才会调用模型里的同名方法
  • name属性要和模型里的方法名完全一致(大小写、拼写都不能错)

第三步:检查模块配置文件

确保你的__openerp__.py(Odoo9的模块配置文件)里正确声明了依赖和加载文件:

{
    'name': 'Product EAN13 Generator',
    'version': '1.0',
    'depends': ['product'],  # 必须依赖原生product模块
    'data': [
        'product_view.xml',  # 加载你的视图文件
    ],
    'installable': True,
    'auto_install': False,
}

最后验证步骤

  1. 卸载并重新安装你的自定义模块(Odoo9修改模型或视图后需要重新安装生效)
  2. 打开产品模板表单,找到你添加的按钮,点击测试

如果还是有问题,可以检查:

  • 方法名是否拼写错误(比如模型里是generate_ean13,xml里写成了generate_ean)
  • 是否有权限调用这个方法(可以给按钮加groups属性,或者确保当前用户有产品编辑权限)
  • 生成EAN13的逻辑是否有错误,比如随机数生成或校验位计算逻辑异常

内容的提问来源于stack exchange,提问作者Dhouha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:58:26