在 Odoo v9 上连接字段

Concatenate fields on Odoo v9

我正在尝试连接 3 个字段以形成内部代码并将其显示在视图中:

我有 3 个模型:

而我想以这样的形式显示

产品代码:CAT-PROD-001

我不知道我是否必须使用计算域或者是否存在其他方法来执行此操作,因为我正在使用计算域进行测试但无法达到所需的输出。

编辑:

现在我正在尝试使用带有 onchange 函数的计算字段来生成字段上的值

型号

# -*- 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_code

ex: 从模型 cour.modl 我想从 cour_code(internal_id for course) 对应的字段中获取值第一个模型上的 cour_exec 字段(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(自我): 美食 = "XX" # 第一个域使用元组而不是列表 cour_result = self.env['cour.modl'].search([('id','=',exec_modl.cour_exec)]).cour_code cour = "" # 空字符串,因为你不能用字符串值连接 None 或 False #if cour_result : # cour = ",".join(crse_code for crse_code in cour_result.ids) #别的 : # 打印 "result of search is empty check you domain" 执行 = "XXX" output = cate+"-"+cour+"-"+exet+"-"+cour_result self.inte_code = 输出

编辑 3

我一直在尝试使用调用其他模型值的搜索模式,但我有控制台输出:

无法适应类型 '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

编辑 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')

Now the output have this structure:

INTERNAL_PROC_ID-CAT_COURSE-COURSE-EXECUTION_CODE

EX: xxxxxxxx-xx-xxxx-xxx

您可以创建新向导。

您可以从向导中生成内部参考。

class create_internal_reference(models.TransientModel):

    _name="create.internal.reference"

    @api.multi
    def create_internal_reference(self):
        product_obj=self.env['product.product']
        active_ids=self._context.get('active_ids')
        if active_ids:
            products=product_obj.browse(active_ids)
            products.generate_new_internal_reference()            
        return True

创建视图 & act_window

<record model="ir.ui.view" id="create_internal_reference_1">
    <field name="name">Create Internal Reference</field>
    <field name="model">create.internal.reference</field>
    <field name="arch" type="xml">
            <form string="Create Internal Reference">
            <footer>
                <button name="create_internal_reference" string="Generate Internal Reference" type="object" class="oe_highlight"/>                  
                <button string="Cancel" class="oe_link" special="cancel" />
            </footer>
        </form>
    </field>
</record>

<act_window name="Generate Internal Reference" res_model="create.internal.reference"
src_model="product.product" view_mode="form" view_type="form"
target="new" multi="True" key2="client_action_multi"
id="action_create_internal_reference"
view_id="create_internal_reference_1"/>
class product_product(models.Model):

   _inherit='product.product'

    @api.multi  
    def generate_new_internal_reference(self):    
        for product in self:
            if not product.internal_reference:
                product.internal_reference='%s-%s-%s'%(str(product.categ_id.name)[:2],str(product.name)[:4],third_field[:3])

从 product.product 更多按钮下您可以访问此向导并生成内部参考。

这可能对您有所帮助。

  1. 首先在计算领域使用 api.depends 而不是 onchange :
  2. 其次,计算函数不 return 任何东西,但它传递 self 变量上的记录,因此您所要做的就是将值分配给计算字段。
@api.depends('proc_exec')
def _onchange_proc(self):
    # compute the value 
    # ... 
    # Than assign it to the field
    self.computed_field =   computed_value

我建议做的一件事是循环 self,因为它是 recordSet,所以如果 self 包含多个记录,那么之前的代码将引发 signlton 错误 所以你可以这样做:

# compute the value here if it's the same for every record in self
for rec in self :
     # compute the value here it depends on the value of the record 
     rec.compute_field = computeValue

或使用 api.oneapi.depends

@api.one
@api.depends('field1', 'field2', ...)

编辑:

    @api.depends('proc_exec')
    def _onchange_proc(self):
        cate    =   "XX"
        # first domain use tuple not list
        cour_result    =   self.env['cour.modl'].search([('cour_desc','=',self.cour_exec)])
        cour = "" # empty string because you cannot contcatenate None or False with a string value
        if cour_result : 
            cour = ",".join(id for id in cour_result.ids)
        else :
            print "result of search is empty check you domain"
        exet    =   "XXX"
        output  =   cate+"-"+cour+"-"+exet
        self.inte_code = output

试试这个代码,我认为搜索的结果是一个记录集,所以你可以通过 name_of_record_set.ids 获取 ID 列表,而不是从 ID 列表中创建一个字符串来连接它尝试让我知道是否有是一个错误,因为我正在使用工作 PC 我手上没有 odoo ^^