openerp創建動態視圖-fields_view_get

openerp的視圖結構是以XML的格式存放於ir.ui.view表中,屬於靜態格式,設計之後就固定,

但可以通過在model中重寫fields_view_get函數,在視圖加載時修改arch屬性,動態修改視圖的結構

def fields_view_get(self, cr, uid, view_id=None,view_type='form',context=None,toolbar=False,submenu=False):
        ip_obj = self.pool.get('hr.rule.input')
        res = super(hr_inputs_editor,self).fields_view_get(cr,uid,view_id,view_type,context,toolbar,submenu)
        if view_type=='form':
            treev = res['fields']['line_ids']['views']['tree']
            doc = etree.XML(treev['arch'])
            for node in doc.xpath("/tree/field"):
                name = node.get('name',False)
                if name.startswith('value'):
                    name = name.replace('value','input') + '_code'
                    cd = context.has_key(name) and context[name] or False
                    if cd:
                        ip_ids = ip_obj.search(cr,uid,[('code','=',cd)],limit=1,context=context)
                        if ip_ids:
                            text = ip_obj.read(cr,uid,ip_ids,['name'])[0]['name']
                            node.set('string',text)
                    else:
                        node.set('modifiers','{"tree_invisible":true}')
            treev['arch'] = etree.tostring(doc)
        return res

注意,必須是通過etree將res['arch']加載到DOM中,通過xpath查找並set修改屬性,然後將修改後的dom通過etree.tostring(doc)寫回res['arch']

如果要修改一對多字段下的子視圖時,需要先運算到子視圖,如:

treev = res['fields']['line_ids']['views']['tree']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章