首页 文章

连接Odoo v9上的字段

提问于
浏览
1

我正在尝试连接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 回答

  • 1
    • 计算字段中的第一个使用api.depends而不是onchange:

    • 其次,计算函数不会返回任何内容,但它会传递自变量上的记录,因此您所要做的就是将值分配给计算字段 .

    @api.depends('proc_exec')
    def _onchange_proc(self):
        # compute the value 
        # ... 
        # Than assign it to the field
        self.computed_field =   computed_value
    

    我建议做的一件事就是循环自我,因为它是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.depends的api.one

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

    EDITS:

    @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 ^^

  • 1

    您可以创建新向导 .

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

    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,您可以访问此向导并生成内部参考 .

    这可能对你有所帮助 .

相关问题