Odoo动态视图,动态字段,动态方法

15 篇文章 1 订阅
15 篇文章 4 订阅

odoo 动态字段

    动态字段,就是根据业务需求来决定生成或者不生成某些字段,同时需要动态视图也跟随着改变。

   通过借鉴前辈的知识经验和阅读源码,我对动态字段的写法有了一个大概的了解。模型中的缺省字段,如create_uid、 create_date、 id等字段并非定义,而是由系统自动生成的。 后运行 Pycharm 的 debug 仔细观察了 _add_field 方法, 此方法是系统定义在基础模型(BaseModel)里,用于为模型添加字段。同时, 该方法必须在模型升级时通过 _setup_base 方法进行调用, 才将字段同步插入到数据库中。

@api.model
def _setup_base(self):
	res = super(模型名, self)._setup_base()
	sef.cr.execute("SELECT type, name
				    FORM res_partner
				    WHERE name 
				    IS NOT NULL")
    result = self.cr.fetchall()
    for name in result:
    	if name[0].lower() not in self._fields:
    	self._add_field('%s_demo' % name[0].lower(),
    					fields.Boolean(string="动态字段%s" % name[1]))
    	self._add_field('%s_case' % name[0].lower(),
    					fields.Char(string="动态字段2%s" % name[1]))
	return res
_cr.excute: 指向数据库游标
cr.dictfetchall()  ==  [{'demo': 12},{'demo': 12},]
cr.dictfetchone() == {'demo': 12}
cr.fetchall() == '[(12),(12)]'
cr.fetchone() == '(12)'
lower():转小写

动态视图

动态的显示页面的字段,属性,页面在前端每次渲染时候都会调用 fields_view_get 方法,通过继承该方法可以动态的修改视图。附源码:
	@api.model
    def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
        res = super(BaseModuleUpgrade, self).fields_view_get(view_id, view_type, toolbar=toolbar,submenu=False)
        if view_type != 'form':
            return res
        if not self.type == 1:
            res['arch'] = '''<form string="示例">
                                <footer>
                                    <button name="示例按钮" string="Start Configuration" type="object" class="btn-primary"/>
                                    <button special="cancel" string="Close" class="btn-secondary"/>
                                </footer>
                             </form>'''

        return res
    	换种写法
    		doc = etree.XML(res['arch'])
            for node in doc.xpath("//field[@name='product_id']"):
                if self._context['type'] in ('in_invoice', 'in_refund'):
                    if 'purchase_ok' in self.env['product.template']._fields:
                        node.set('domain', "[('purchase_ok', '=', True)]")
                else:
                    node.set('domain', "[('sale_ok', '=', True)]")
            res['arch'] = etree.tostring(doc, encoding='unicode')
        return res
       需要用到 etree 方法 ,未透彻了解,以后进行补充
       from lxml import etree
动态方法在审批流模块之中见到过,还没探究明白,等以后了解了再进行补充
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值