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

Odoo 15 实现联系人列表按当前用户过滤的技术咨询

Odoo 15 实现联系人列表按当前用户过滤的技术咨询

嘿,我来帮你梳理下这个需求的实现思路哈!你已经在Odoo 15的联系人模块里给res.partner模型新增了多对多的负责人字段,还继承了表单视图,现在想要实现联系人列表默认只显示分配给当前登录用户的记录对吧?先把你已经写好的代码整理出来,再给你几个可行的实现方案:

你已完成的代码部分

1. 模型扩展(添加负责人字段)

class Partner(models.Model):
    _name = 'res.partner'
    _inherit = 'res.partner'

    assignee_ids = fields.Many2many(
        'res.users',
        relation='contacts_contact_user_rel',
        column1='contact_id',
        column2='user_id',
        string='Assignees',
        default=lambda self: not self.env.user.share and self.env.user,
        context={'active_test': False},
        tracking=True
    )

2. 表单视图继承(补全参考)

看起来你已经开始写表单视图的继承了,应该是要把新增的assignee_ids字段加到联系人表单里,完整的实现参考如下:

<record id="res_contact_view_form" model="ir.ui.view">
    <field name="name">res.contact.view.form</field>
    <field name="model">res.partner</field>
    <field name="inherit_id" ref="base.view_partner_form"/>
    <field name="arch" type="xml">
        <!-- 示例:把字段加到分类标签的后面 -->
        <xpath expr="//field[@name='category_id']" position="after">
            <field name="assignee_ids" widget="many2many_tags"/>
        </xpath>
    </field>
</record>

实现列表按当前用户过滤的几种方案

方案一:添加默认过滤器(推荐,灵活可控)

这种方式用户可以自由切换是否过滤,既满足默认只看自己负责的联系人,又能随时查看全部。你需要继承联系人的搜索视图,添加一个默认启用的过滤器:

<record id="res_contact_view_search_inherit" model="ir.ui.view">
    <field name="name">res.contact.view.search.inherit</field>
    <field name="model">res.partner</field>
    <field name="inherit_id" ref="base.view_partner_search"/>
    <field name="arch" type="xml">
        <!-- 把过滤器加到「我的联系人」后面 -->
        <xpath expr="//filter[@name='my_contacts']" position="after">
            <filter 
                name="my_assigned_contacts" 
                string="我的负责联系人" 
                domain="[('assignee_ids', 'in', [uid])]" 
                default="1"/>
        </xpath>
    </field>
</record>

方案二:重写search方法强制过滤(权限严格场景)

如果要求普通用户只能看到分配给自己的联系人,管理员不受限制,就可以重写模型的search方法:

class Partner(models.Model):
    _inherit = 'res.partner'

    def search(self, args, offset=0, limit=None, order=None, count=False):
        # 管理员组用户跳过过滤
        if not self.env.user.has_group('base.group_system'):
            args += [('assignee_ids', 'in', self.env.uid)]
        return super(Partner, self).search(args, offset=offset, limit=limit, order=order, count=count)

注意:这个方法是强制过滤,普通用户没法看到未分配给自己的联系人,适合权限管控严格的场景。

方案三:在列表视图设置默认搜索域

还可以通过继承列表视图,在context里指定默认启用刚才的过滤器,和方案一配合使用:

<record id="res_contact_view_tree_inherit" model="ir.ui.view">
    <field name="name">res.contact.view.tree.inherit</field>
    <field name="model">res.partner</field>
    <field name="inherit_id" ref="base.view_partner_tree"/>
    <field name="arch" type="xml">
        <xpath expr="//tree" position="attributes">
            <attribute name="context">{'search_default_my_assigned_contacts': True}</attribute>
        </xpath>
    </field>
</record>

这里search_default_后面的名称要和方案一过滤器的name完全一致哦。

备注:内容来源于stack exchange,提问作者Huan Ho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:49:33