You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:06:28