跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 浅色
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • 深色
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. 关于many2one的domain问题

关于many2one的domain问题

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

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

      D 离线
      D 离线
      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
      • 阿 阿巴阿巴

        有两个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 离线
        L 离线
        leuan
        发表于 最后由 编辑
        #2

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

        阿 1 条回复 最后回复
        0
        • L leuan

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

          阿 离线
          阿 离线
          阿巴阿巴
          发表于 最后由 编辑
          #3

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

          D 1 条回复 最后回复
          0
          • 阿 阿巴阿巴

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

            D 离线
            D 离线
            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
            • D 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方法所取代。

              阿 离线
              阿 离线
              阿巴阿巴
              发表于 最后由 编辑
              #5

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

              D 1 条回复 最后回复
              0
              • 阿 阿巴阿巴

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

                D 离线
                D 离线
                digitalsatori
                管理员
                发表于 最后由 编辑
                #6

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

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

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

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

                1 条回复 最后回复
                0
                • D digitalsatori 将这个主题标记为已解决,在

                你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

                厌倦了每次访问都刷到同样的帖子?您注册账号后,您每次返回时都能精准定位到您上次浏览的位置,并可选择接收新回复通知(通过邮件或推送通知)。您还能收藏书签、为帖子顶,向社区成员表达您的欣赏。

                有了你的建议,这篇帖子会更精彩哦 💗

                注册 登录
                回复
                • 在新帖中回复
                登录后回复
                • 从旧到新
                • 从新到旧
                • 最多赞同


                • 登录

                • 没有帐号? 注册

                • 登录或注册以进行搜索。
                • 第一个帖子
                  最后一个帖子
                0
                • 版块
                • 标签
                • 热门
                • 用户
                • 群组