从按钮搜索结果返回以显示在OpenERP中的同一页面上

时间:2014-12-15 16:02:09

标签: python openerp odoo

我创建了“搜索”按钮,单击该按钮可在新窗口中启动树视图结果。 我希望在“搜索”按钮所在的同一页面上的树视图中显示结果,位于“搜索”按钮的正下方。谢谢你的帮助!

以下是视图的外观:

enter image description here

这是py代码:

class mrp_bom(osv.Model):
    _inherit = 'mrp.bom'

    def action_search(self, cr, uid, ids, vals, context=None):
        bom_ids = []
        pd_ids = []
        product_complete = []
        ptemplid = int(self.browse(cr, uid, ids[0], context=context).product_tmpl_id.id)
        mbl_obj = self.pool.get('mrp.bom.line')
        id_s = mbl_obj.search(cr, uid,  [('product_id', '=', ptemplid)])
        for rec in mbl_obj.browse(cr, uid, id_s, context=context):    
            bom_ids.append(rec.bom_id.id) 
        for rec in self.browse(cr, uid, bom_ids, context=context):    
            pd_ids.append(rec.product_id.id)
        pp_obj = self.pool.get('product.product')
        for rec in pp_obj.browse(cr, uid, pd_ids, context=context):    
            product_complete.append('['+ str(rec.default_code) + ']'+ ' ' + str(rec.name_template))
        print "\n\n Inside action_search() product_complete ", product_complete
        # raise osv.except_osv(('Message!'), ('Inside action_search!' ) )
        # vals = {'product_id' : product_complete}
        # print "\n\n Inside action_search() vals ", vals
        # return {'value' : vals}
        domain = [('id','=',bom_ids)]
        return {
         'type': 'ir.actions.act_window',
         'name': _('BOM'),
         'res_model': 'mrp.bom',
         'view_mode': 'tree',
         'target': 'inlineview',
         'domain': domain,
               }

这是我的XML:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
         <record id="action3" model="ir.actions.act_window">
            <field name="name">Search BOM</field>
            <field name="type">ir.actions.act_window</field>
            <field name="res_model">mrp.bom</field>
            <field name="domain">[('bom_id', 'in', active_ids)]</field>
            <field name="view_type">form</field>
            <field name="target">inline</field>
            <field name="view_id" ref="bom_where_use_form"/>
        </record>
        <record id="ir_BOM_structure3" model="ir.values">
            <field eval="'client_action_multi'" name="key2"/>
            <field eval="'mrp.bom'" name="model"/>
            <field name="name">Search BOM</field>
            <field eval="'ir.actions.act_window,'+str(action3)" name="value"/>
        </record>

         <record id="bom_where_use_form" model="ir.ui.view">
            <field name="name">bom.where.use.form</field>
            <field name="model">mrp.bom</field>
            <field name="priority" eval="20"/>
            <field name="type">form</field>
            <field name="arch" type="xml">
                <label for="product_tmpl_id" string="Search BOM by Product" />
                <field name="product_tmpl_id" > </field>
                <button name="action_search" string="Search" type="object" class="oe_highlight"/>               
            </field> 
        </record>

    </data>
</openerp>

1 个答案:

答案 0 :(得分:0)

首先,我认为你有理由不遵循Atul Arvind的评论 - 我不明白你为什么不以正常的方式做到这一点。简单的树视图附加了一个搜索视图...

但是,假设你(或你的用户)有一些非常复杂的场景,你需要在一些更复杂的形式中使用这个搜索功能。在这种情况下,我建议你使用Odoo的onchange功能,这是在@ api.depends装饰器的帮助下在第8版中完成的。

考虑以下示例。我只是给你Python代码,因为我很确定它足以让你看到整个想法:

from openerp import models, fields, api


class mrp_bom_search(models.Model):
    _name = 'mrp.bom.search'

    product = fields.Many2one('product.product')
    boms = fields.Many2many('mrp.bom', compute='_get_boms')

    @api.depends('product')
    def _get_boms(self):
        mbl_obj = self.env['mrp.bom.line']
        bom_lines = mbl_obj.search([('product_id', '=',
                                self.product.id)])
        self.boms = bom_lines.bom_id

mrp_bom_search()

我希望你能看到所提出的解决方案最简单的外观。