Openerp 连接ODOOV9上的字段
我正在尝试连接3个字段以形成一个内部代码,并将其显示在视图中: 我有3种型号:Openerp 连接ODOOV9上的字段,openerp,odoo-9,Openerp,Odoo 9,我正在尝试连接3个字段以形成一个内部代码,并将其显示在视图中: 我有3种型号: 类别(大小=2) 产品(尺寸=4) 系列(尺寸=3) 我想以这样的形式显示它 产品代码:CAT-PROD-001 我不知道我是否必须使用一个计算字段,或者是否存在其他方法来实现这一点,因为我正在使用计算字段进行测试,但无法达到所需的输出 编辑: 现在我尝试使用一个带有onchange函数的计算字段来生成字段上的值 型号 # -*- coding:utf-8 -*- from openerp import mode
- 类别(大小=2)
- 产品(尺寸=4)
- 系列(尺寸=3)
# -*- coding:utf-8 -*-
from openerp import models,fields,api
class exec_modl(models.Model):
_name = "exec.modl"
_rec_name = "exec_desc"
exec_code = fields.Char('Identificador',required=True,size=3)
exec_desc = fields.Char('Descripción',required=True)
cour_exec = fields.Many2one('cour.modl')
proc_exec = fields.Many2one('enro.modl')
inte_code = fields.Char(compute='_onchange_proc')
功能
@api.onchange('proc_exec')
def _onchange_proc(self):
cate = "XX"
cour = "XXXX"
exet = "XXX"
output = cate+"-"+cour+"-"+exet
return output
我只是尝试使用普通值,只是想知道如何将其发送到字段
编辑2:
使用@Charif的答案,我可以在表单上打印静态字符串,但我试图达到的下一个里程碑是将代码(外部模型字段)放入inte_代码的板条箱中
例如:从模型cour.modl中,我想从字段cour\u code(课程的内部id)中获取与第一个模型上的cour\u exec字段相对应的值(cour\u exec字段具有cour.modl模型中的课程描述)
E@api.dependens('inte_code'))
定义更改过程(自):
cate=“XX”
#第一个域使用元组不是列表
cour_result=self.env['cour.modl'].search([('id','=',exec_modl.cour_exec)]).cour_代码
cour=”“#空字符串,因为不能用字符串值连接None或False
#如果结果是:
#cour=“,”.join(cour_result.ids中crse_代码的crse_代码)
#其他:
#打印“搜索结果为空检查您的域”
exet=“XXX”
输出=cate+“-”+cour+“-”+exet+“-”+cour\u结果
self.inte_代码=输出
编辑3
我一直试图使用搜索模式调用其他模型值,但我有控制台输出:
无法调整类型“manyOne”,似乎我正在尝试比较两种不同类型的字段,这些类型可以在odoo上解析?或者我对搜索方法使用了错误的语法
@api.depends('inte_code')
def _onchange_proc(self):
cate = "XX"
# first domain use tuple not list
cour_result = self.env['cour.modl'].search([('id','=',exec_modl.cour_exec)]).cour_code
exet = "XXX"
output = cate+"-"+cour+"-"+exet+"-"+cour_result
self.inte_code = output
编辑4:回答
我终于达到了预期的输出使用以下代码:
@api.depends('inte_code')
def _onchange_proc(self):
cate_result = self.cate_exec
proc_result = self.env['enro.modl'].search([('id','=',str(self.proc_exec.id))]).enro_code
cour_result = self.env['cour.modl'].search([('id','=',str(self.cour_exec.id))]).cour_code
output = str(proc_result)+"-"+str(cate_result)+"-"+str(cour_result)+"-"+self.exec_code
self.inte_code = output
此外,我还添加了一个相关字段,用于将课程类别添加到最终输出中
cate_exec = fields.Char(related='cour_exec.cour_cate.cate_code')
现在,输出具有以下结构:
内部过程ID-CAT过程执行代码
例:xxxxxxxx-xx-xxxx-xxx
您可以创建新向导 从向导中,您可以生成内部引用
类创建内部参考(models.TransientModel):
_name=“create.internal.reference”
@api.multi
def创建内部参考(自我):
product_obj=self.env['product.product']
active\u id=self.\u context.get('active\u id'))
如果活动的\u ID:
产品=产品对象浏览(活动标识)
products.generate_new_internal_reference()
返回真值
创建视图和动作窗口
创建内部引用
创建.internal.reference
类别产品\u产品(models.Model):
_继承class='product.product'
@api.multi
def生成新的内部参考(自身):
对于产品本身:
如果不是产品内部参考:
product.internal_reference='%s-%s-%s'%(str(product.categ_id.name)[:2],str(product.name)[:4],第三个_字段[:3])
在“更多”按钮下的product.product中,您可以访问此向导并生成内部引用
这可能对你有帮助
@api.dependens('proc_exec'))
定义更改过程(自):
#计算值
# ...
#然后将其分配给字段
self.computed_字段=计算的_值
我建议做的一件事是循环self,因为它是记录集,所以如果self包含多个记录,那么前面的代码将引发signlton错误
所以你可以这样做:
#如果self中每个记录的值相同,则在此计算值
对于rec in self:
#计算这里的值,它取决于记录的值
rec.compute_字段=计算值
或者使用api.one
和api.dependents
@api.one
@依赖于('field1','field2',…)
编辑:
@api.dependens('proc_exec'))
定义更改过程(自):
cate=“XX”
#第一个域使用元组不是列表
cour_result=self.env['cour.modl'].search([('cour_desc','=',self.cour_exec)])
cour=”“#空字符串,因为不能用字符串值连接None或False
如果结果是:
cour=“,”.join(cour_result.ids中id的id)
其他:
打印“搜索结果为空检查您的域”
exet=“XXX”
输出=cate+“-”+cour+“-”+exet
self.inte_代码=输出
试试这段代码我认为搜索的结果是一个记录集,这样你就可以通过名称\u of_record\u set.ids获得ID列表,然后从ID列表中创建一个字符串来连接它。尝试并让我知道是否有错误,因为我使用的是work PC,我手上没有odoo^是这个字段中的一个,如果不是,那么使用compute字段我已经添加了一些本地测试的代码,这些代码非常复杂,不仅仅是使用计算字段?你也可以使用计算字段,但在计算字段中,每个测试都会使用计算字段
cate_exec = fields.Char(related='cour_exec.cour_cate.cate_code')