Odoo 中文社区

    • 注册
    • 登录
    • 搜索
    • 版块
    • 标签
    • 热门
    • 用户
    • 群组

    Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

    由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

    本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

    开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

    如果您登录系统碰到问题,请在微信公众号留言:

    已解决 关于many2one的domain问题

    Odoo 开发与实施交流
    3
    6
    529
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 阿
      阿巴阿巴 最后由 编辑

      有两个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
      • digitalsatori
        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
          leuan @阿巴阿巴 最后由 编辑

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

          阿 1 条回复 最后回复 回复 引用 0
          • 阿
            阿巴阿巴 @leuan 最后由 编辑

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

            digitalsatori 1 条回复 最后回复 回复 引用 0
            • digitalsatori
              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
              • 阿
                阿巴阿巴 @digitalsatori 最后由 编辑

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

                digitalsatori 1 条回复 最后回复 回复 引用 0
                • digitalsatori
                  digitalsatori 管理员 @阿巴阿巴 最后由 编辑

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

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

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

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

                  1 条回复 最后回复 回复 引用 0
                  • Topic has been marked as solved  digitalsatori digitalsatori 
                  • First post
                    Last post