添加自定义筛选、分组时加载所需字段
点我下载完整odoo的demo
python学习手册大全点我下载
需求
:
在筛选、分组中添加自定义条件时默认加载所有model中的字段,这样不是很友好,那怎么样才能只加载所需的字段呢?
方案
:
创建一个my_bass_model子应用,进入项目根目录
cd myproject
python D:\learn\odoo_learn\odoo\odoo-bin scaffold my_base_model .
在models中添加一个fields_filter.py
使用钩子重写AbstractModel中的fields_get()函数,当加载页面时会先调用fields_get()函数,在每个字段中有
searchable(筛选)和sortable(分组)两个布尔属性,这两个属性都默认为True,所以把字段中的这两个属性修
改为False即可让这个字段不出现在筛选、分组中。
代码
:
from odoo import models, fields, api
class FieldsFilter(models.AbstractModel):
def _register_hook(self):
origin_fields_get = models.AbstractModel.fields_get
def parse_fields(res, fields, key='searchable'):
for s in fields.split(','):
def fields_get(self, allfields=None, attributes=None):
res = origin_fields_get(self, allfields, attributes)
fields_filter = self.env['ir.config_parameter'].sudo().get_param('show_fields_filter') or "{}"
fields_filters = json.loads(fields_filter)
# TODO 列表视图字段筛选、分组自定义需要的字段
if self._name not in fields_filters:
res[key]['searchable'] = False
res[key]['sortable'] = False
parse_fields(res, fields_filters[self._name].get('searchable'))
parse_fields(res, fields_filters[self._name].get('sortable'), 'sortable')
models.AbstractModel.fields_get = fields_get
return super(FieldsFilter, self)._register_hook()
debug模式下,【设置】->【技术】->【系统参数】,在系统参数中定义一个json格式的参数,如:
"searchable":"name,phone,partner_id,website,create_uid",
"sortable":"name, phone,partner_id,create_uid"
意思就是res.company这个model中的这些字段才显示在筛选、分组中的添加自定义条件中。
注意:需要你安装这个应用才会被系统调用到钩子函数。
效果:
给所有的model添加一个通用的方法
class BaseModelExtend(models.AbstractModel):
_name = 'basemodel.extend'
def _register_hook(self):
Register method in BaseModel
def funcA(self, **kwargs):
models.BaseModel.funcA = funcA #将此方法传递给BaseModel
return super(BaseModelExtend, self)._register_hook()
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
公众号
关注我,我们一起成长~~