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
动态方法在审批流模块之中见到过,还没探究明白,等以后了解了再进行补充