• 版块
  • 标签
  • 热门
  • 用户
  • 群组
Skins
  • Light
  • Default
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Quartz
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Slate
  • Solar
  • Superhero
  • Vapor
Collapse

Odoo 中文社区

关于many2one的domain问题

已定时 已固定 已锁定 已移动 已解决 Odoo 开发与实施交流
6 帖子 3 发布者 545 浏览
    • 从旧到新
    • 从新到旧
    • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 阿 离线
    阿 离线
    阿巴阿巴
    写于 最后由 编辑
    #1

    有两个many2one字段,类似于省市的两级联动,如下:

    province_id = fields.Many2one('模型1', string='省')
    city_id = fields.Many2one('模型2', string='市')
    

    目前的需求是根据省province_id的值,动态筛选市city_id显示的值。
    根据网上的说法,我用了以下onchange函数

    @api.onchange('province_id')
    def _onchange_city(self):
        # 取对应的省的值
        province_value = self.province_id .province 
        # 将取到的值跟模型2中市对应的省值进行比较匹配
        area_id_list = []
        for record in self.env['模型2'].search([('city_id.省的值', '=', province_value)]).ids:
            area_id_list.append(record)
        # 用列表中的id去筛选,符合的留下
        domain = {'city_id ': [('id', 'in', area_id_list)]}
        return {'domain': domain}
    

    最后得出来的效果跟odoo13中公司的国家和省的字段选择是一样的,如图:
    238773ec-c737-4652-9744-87357383b415-image.png
    但是出现了一个问题:在第一次编辑时选择了国家--“中国”,然后退出此记录再进去编辑时,省的选择会变成全部而不是在属于中国的省里进行筛选,如图:
    32d69bdc-9912-4224-a3a1-11858f951a80-image.png
    想要询问的是,有没有办法在第二次进入以后,省的选择能通过国家的字段值进行筛选后显示,或者有类似的解决办法。
    非常感谢大家!

    L 1 条回复 最后回复
    0
  • digitalsatoriD 离线
    digitalsatoriD 离线
    digitalsatori 管理员
    在 中回复了阿巴阿巴 最后由 编辑
    #

    @阿巴阿巴 用onchange方法返回domain的办法来过滤另一个Many2X的列表的确有楼主所描述的问题。

    其实你所描述的问题,只要模型2上有指向模型1的Many2one字段(比如:province_id,就可以直接在city_id字段上添加domain来获得需要的效果:

     city_id = fields.Many2one("模型2", string='市',  domain="[('province_id', '=?', province_id)]")
    

    注意:domain中带引号的'province_id'表示你模型2上的字段,而后面的没有引号的字段province_id表示当前对象上的字段。

    另外,要了解一下,onchange方法会逐渐被compute方法所取代。

    【上海先安科技】(tony AT openerp.cn)

    阿 1 条回复 最后回复
    0
  • L 离线
    L 离线
    leuan
    在 中回复了阿巴阿巴 最后由 编辑
    #2

    @阿巴阿巴 一个 onchange 就可以解决了

    阿 1 条回复 最后回复
    0
  • 阿 离线
    阿 离线
    阿巴阿巴
    在 中回复了leuan 最后由 编辑
    #3

    @leuan 你好,我使用的是onchange,但是onchange需要在字段国家改变值后才能响应函数,我在第二次进入记录进行编辑时,并没有改变国家的值,而是在第一次编辑后的国家的值下,进行选择省的值,这个时候会出现所有的省和地区,并没有进行筛选。

    digitalsatoriD 1 条回复 最后回复
    0
  • digitalsatoriD 离线
    digitalsatoriD 离线
    digitalsatori 管理员
    在 中回复了阿巴阿巴 最后由 编辑
    #4

    @阿巴阿巴 用onchange方法返回domain的办法来过滤另一个Many2X的列表的确有楼主所描述的问题。

    其实你所描述的问题,只要模型2上有指向模型1的Many2one字段(比如:province_id,就可以直接在city_id字段上添加domain来获得需要的效果:

     city_id = fields.Many2one("模型2", string='市',  domain="[('province_id', '=?', province_id)]")
    

    注意:domain中带引号的'province_id'表示你模型2上的字段,而后面的没有引号的字段province_id表示当前对象上的字段。

    另外,要了解一下,onchange方法会逐渐被compute方法所取代。

    【上海先安科技】(tony AT openerp.cn)

    阿 1 条回复 最后回复
    0
  • 阿 离线
    阿 离线
    阿巴阿巴
    在 中回复了digitalsatori 最后由 编辑
    #5

    @digitalsatori 谢谢您的回答,解决了困惑我几周的问题。
    另外想询问您关于“onchange方法会逐渐被compute方法所取代”的疑问:在我学习到的知识里,compute与@api.depends()是联动的,在监听到值改变后,用于实时计算值,是否我忽略了其它东西?

    digitalsatoriD 1 条回复 最后回复
    0
  • digitalsatoriD 离线
    digitalsatoriD 离线
    digitalsatori 管理员
    在 中回复了阿巴阿巴 最后由 编辑
    #6

    @阿巴阿巴 在 关于many2one的domain问题 中说:

    我学习到的知识里,compute与@api.depends()是联动的,在监听到值改变后,用于实时计算值,是否我忽略了其它东西?

    对啊,所以说compute字段通过depends可以取代onchange方法啊。至于onchange返回warning,domain这些也可以用其他方法来替代。

    【上海先安科技】(tony AT openerp.cn)

    1 条回复 最后回复
    0
  • Topic has been marked as solved

  • 登录

  • 没有帐号? 注册

  • Login or register to search.
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
  • 登录

  • 没有帐号? 注册

  • Login or register to search.