我正在尝试连接3个字段以形成内部代码并在视图中显示它:
我有3个型号:
-
类别(尺寸= 2)
-
产品(尺寸= 4)
-
系列(尺寸= 3)
我希望以这样的形式显示它
产品代码:CAT-PROD-001
我不知道我是否必须使用计算字段或者是否存在另外的方法来执行此操作,因为我正在使用计算字段进行测试但无法达到所需的输出 .
Edit:
现在,我正在尝试使用带有onchange函数的计算字段来生成字段上的值
MODEL
# -*- 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')
FUNCTION
@api.onchange('proc_exec')
def _onchange_proc(self):
cate = "XX"
cour = "XXXX"
exet = "XXX"
output = cate+"-"+cour+"-"+exet
return output
我只是想用简单的值来了解如何将它发送到现场 .
EDIT 2:
使用来自@Charif的答案我可以在表单上打印静态字符串,但是我想要达到的下一个里程碑是获取代码(外部模型字段)来表示 inte_code
例如:从模型cour.modl我想从第一个模型上的cour_exec字段对应的字段 cour_code(internal_id for course) 中获取值(cour_exec字段具有来自cour.modl模型的课程描述)
@api.depends('proc_exec')
def _onchange_proc(self):
cate = "XX"
cour = self.env['cour.modl'].search([['cour_desc','=',self.cour_exec]])
exet = "XXX"
output = cate+"-"+cour+"-"+exet
self.inte_code = output
E @ 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 cour =“”#empty string因为你不能用字符串值concatenate None或False #if cour_result:#cour =“,” . join(cour_code中crse_code的crse_code) #else:#print“搜索结果为空检查你的域名”exet =“XXX”output = cate“ - ”cour“ - ”exet“ - ”cour_result self.inte_code = output
EDIT 3
我一直在尝试使用调用其他模型值的搜索模式,但我有控制台输出:
Can't adapt type 'Many2One' ,似乎我试图比较2种不同类型的字段,类型可以在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
EDIT 4 : ANSWER Finally I've reach the desired output! 使用以下代码:
@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')
现在输出具有以下结构:INTERNAL_PROC_ID-CAT_COURSE-COURSE-EXECUTION_CODE EX:xxxxxxxx-xx-xxxx-xxx
2 回答
计算字段中的第一个使用api.depends而不是onchange:
其次,计算函数不会返回任何内容,但它会传递自变量上的记录,因此您所要做的就是将值分配给计算字段 .
我建议做的一件事就是循环自我,因为它是recordSet所以如果self包含多个记录,那么前面的代码会引发signlton错误,所以你可以这样做:
或者使用带有api.depends的api.one
EDITS:
试试这段代码我认为搜索的结果是一个记录集,所以你可以通过name_of_record_set.ids获取id列表,而不是从id列表创建一个字符串来连接它试试让我知道是否有错误因为我是使用工作PC我手上没有odoo ^^
您可以创建新向导 .
从向导中,您可以生成内部参考 .
创建视图和act_window
从更多按钮下的product.product,您可以访问此向导并生成内部参考 .
这可能对你有所帮助 .