如何解决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, }
最后验证步骤
- 卸载并重新安装你的自定义模块(Odoo9修改模型或视图后需要重新安装生效)
- 打开产品模板表单,找到你添加的按钮,点击测试
如果还是有问题,可以检查:
- 方法名是否拼写错误(比如模型里是
generate_ean13,xml里写成了generate_ean) - 是否有权限调用这个方法(可以给按钮加
groups属性,或者确保当前用户有产品编辑权限) - 生成EAN13的逻辑是否有错误,比如随机数生成或校验位计算逻辑异常
内容的提问来源于stack exchange,提问作者Dhouha
相关产品推荐
相关产品推荐

