Odoo项目看板视图搜索过滤器动态domain与名称实现方法
问题根因
Odoo搜索视图中<filter>标签的domain属性在前端浏览器侧解析执行,无法直接读取后端Python模型层定义的字段值。你直接在domain中写入specialty_user/department_user变量时,前端执行上下文不存在该变量,就会触发domain求值失败的报错。
另外你原有代码中定义的specialty_user字段存在逻辑偏差:关联user_id.department_id.name取的是项目负责人的部门,不是当前登录用户的部门,不符合你要匹配登录用户所属部门的需求。
实现方案
全部逻辑通过后端Python实现,无需修改前端JS,兼容Odoo12及以上版本。
1. 实现动态domain匹配
不要在XML中硬编码过滤器domain,改为通过context传递过滤器激活标记,后端自动追加匹配条件:
- 第一步:修改XML中过滤器配置,移除硬编码domain,改为传递context标记:
<filter name="userSpecialty" string="My specialty" context="{'filter_user_specialty': 1}"/>
- 第二步:在
project.project模型的继承代码中重写_search方法,检测到过滤器激活时自动追加动态匹配条件:
from odoo import models, api class ProjectProject(models.Model): _inherit = 'project.project' @api.model def _search(self, args, offset=0, limit=None, order=None, count=False, access_rights_uid=None): # 识别自定义过滤器激活状态,追加动态domain if self.env.context.get('filter_user_specialty'): # 直接取当前登录用户的部门名称 current_dept = self.env.user.department_id.name args.append(('project_tag', '=', current_dept)) return super()._search(args, offset=offset, limit=limit, order=order, count=count, access_rights_uid=access_rights_uid)
2. 实现过滤器名称动态显示
XML中string属性为静态值,通过重写fields_view_get方法,在视图返回前端前动态替换过滤器显示文本:
在上述project.project模型类中追加以下代码:
@api.model def fields_view_get(self, view_id=None, view_type='search', toolbar=False, submenu=False): res = super().fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu) if view_type == 'search': from lxml import etree current_dept = self.env.user.department_id.name # 解析视图结构定位自定义过滤器节点 doc = etree.XML(res['arch']) target_filter = doc.xpath("//filter[@name='userSpecialty']") if target_filter: # 自定义显示文本格式,可按需调整 target_filter[0].set('string', f'我的所属部门:{current_dept}') res['arch'] = etree.tostring(doc, encoding='unicode') return res
完整XML配置参考
替换原有XML代码即可,默认激活过滤器的配置无需修改:
<odoo> <!-- 新增自定义过滤器 --> <record id="project_view_project_project_filter_inherit" model="ir.ui.view"> <field name="name">project.view.project.project.filter.inherit</field> <field name="model">project.project</field> <field name="inherit_id" ref="project.view_project_project_filter"/> <field name="arch" type="xml"> <xpath expr="//search[1]/separator[1]" position="after"> <filter name="userSpecialty" string="My specialty" context="{'filter_user_specialty': 1}"/> </xpath> </field> </record> <!-- 设置过滤器默认激活 --> <record id="project.open_view_project_all" model="ir.actions.act_window"> <field name="context">{'search_default_userSpecialty': 1}</field> </record> </odoo>
注意事项
- 代码部署后需要重启Odoo服务,升级对应自定义模块,同时刷新浏览器清除前端静态资源缓存
- 请确保登录用户的
department_id字段已配置对应值,否则匹配条件会变为project_tag = False,无法查询到预期数据 - 如果需要匹配项目负责人的部门而非登录用户的部门,将代码中
self.env.user.department_id.name替换为你原有逻辑即可
内容的提问来源于stack exchange,提问作者TheoB
相关产品推荐
相关产品推荐

