添加自定义筛选、分组时加载所需字段

​​ ​点我下载完整odoo的demo​


​python学习手册大全点我下载​

需求

在筛选、分组中添加自定义条件时默认加载所有model中的字段,这样不是很友好,那怎么样才能只加载所需的字段呢?

18、odoo添加自定义筛选、分组时加载所需字段_字段

方案

创建一个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即可让这个字段不出现在筛选、分组中。

代码

# -*- coding: utf-8 -*-
    
import json
from odoo import models, fields, api
    
class FieldsFilter(models.AbstractModel):
_name = 'fields.filter'
    
@api.model
def _register_hook(self):
# 注册钩子函数
origin_fields_get = models.AbstractModel.fields_get
    
def parse_fields(res, fields, key='searchable'):
if fields:
for s in fields.split(','):
# 筛选
s = s.strip()
if s not in res:
continue
    
res[s][key] = True
    
@api.model
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 "{}"
try:
fields_filters = json.loads(fields_filter)
except:
return res
    
# TODO  列表视图字段筛选、分组自定义需要的字段
if self._name not in fields_filters:
return res
    
for key in res.keys():
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')
    
return res
    
models.AbstractModel.fields_get = fields_get
return super(FieldsFilter, self)._register_hook()

debug模式下,【设置】->【技术】->【系统参数】,在系统参数中定义一个json格式的参数,如:

show_fields_filter  值   {
"res.company":{
"searchable":"name,phone,partner_id,website,create_uid",
"sortable":"name, phone,partner_id,create_uid"
}
}

意思就是res.company这个model中的这些字段才显示在筛选、分组中的添加自定义条件中。

注意:需要你安装这个应用才会被系统调用到钩子函数。

效果:

18、odoo添加自定义筛选、分组时加载所需字段_加载_02

给所有的model添加一个通用的方法

class BaseModelExtend(models.AbstractModel):
_name = 'basemodel.extend'
    
@api.model
def _register_hook(self):
'''
Register method in BaseModel
'''
@api.model
def funcA(self, **kwargs):
#code
return True
    
models.BaseModel.funcA = funcA #将此方法传递给BaseModel
return super(BaseModelExtend, self)._register_hook()

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

公众号

18、odoo添加自定义筛选、分组时加载所需字段_字段_03

关注我,我们一起成长~~