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

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

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. One2many 还是丢了 context ?

One2many 还是丢了 context ?

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

    重庆-mrshelly(49812643) 16:35:47
    广州-步科(17779104)  15:20:00
    重庆-mrshelly(49812643) 13:09:29
    但是 one2many 还是丢了 context 的.

    @重庆-mrshelly ,总监能否发个贴 ~ ,给个具体案例,这样木有上下文的。。。

    臣妾看不懂啊 ~



    最简单的需求例子:

    在 盘点单明细上 related 产品的 qty_available 并 stored=False
    目的是, 在录入盘点单的时候, 参得到该产品在 盘点时刻 对应的库位上 的在手数量


    然后 因为要得到该库位在该时刻的该产品 的在手数量, 就需要将 盘点单 的日期, 与 明细表的 库位 这两个信息用 context 传递下去.


    所以, 就在 盘点单明细(stock.inventory.line) 的 qty_available 字段上添加 context

    <field name="qty_available" context="{'location': location_id, 'to_date': parent.date}" />


    然后 在 产品(product.product) 的 qty_available function 字段上断点, 看 context 的值.

    1 条回复 最后回复
    0
    • W 离线
      W 离线
      wangbuke
      写于 最后由 编辑
      #2

      根据总监的意思,写了个小模块,详情请下载附件。部分代码如下:

      stock.py

      <br /><br />from openerp.osv import osv, fields<br /><br />class stock_inventory_line(osv.osv):<br />&nbsp; &nbsp; _inherit = &quot;stock.inventory.line&quot;<br />&nbsp; &nbsp; _columns = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;qty_available&#039;: fields.related(&#039;product_id&#039;,&#039;qty_available&#039;,type=&#039;float&#039;,string=&#039;Qty Available&#039;),<br />&nbsp; &nbsp; }<br /><br />
      



      stock_view.xml

      <br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;record model=&quot;ir.ui.view&quot; id=&quot;view_inventory_qty_form&quot;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;field name=&quot;name&quot;&gt;stock.inventory.form&lt;/field&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;field name=&quot;model&quot;&gt;stock.inventory&lt;/field&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;field name=&quot;inherit_id&quot; ref=&quot;stock.view_inventory_form&quot; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;field name=&quot;arch&quot; type=&quot;xml&quot;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;field name=&quot;product_qty&quot; position=&quot;after&quot;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;field name=&quot;qty_available&quot; context=&quot;{&#039;location&#039;: location_id, &#039;to_date&#039;: parent.date}&quot; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/field&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/field&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;/record&gt;<br /><br />
      
      1 条回复 最后回复
      0
      • W 离线
        W 离线
        wangbuke
        写于 最后由 编辑
        #3

        首先说明下:上一贴和附件的代码,都是没能实现需求的。。。。 😎

        1、需求
        [quote]目的是, 在录入盘点单的时候, 参得到该产品在 盘点时刻 对应的库位上 的在手数量[/quote]

        理所当然是采用onchange来运算嘛, 修改 product_id view 如下:

        <field context="{'location':location_id, 'uom':product_uom, 'to_date':parent.date}" name="product_id" on_change="on_change_product_id(location_id,product_id,product_uom,parent.date, context)"  domain="[('type','&lt;&gt;','service')]"/>

        注:on_change_product_id 加了 context 参数,因此 on_change_product_id 也必须改改:
            def on_change_product_id(self, cr, uid, ids, location_id, product, uom=False, to_date=False, context=None):
                """ Changes UoM and name if product_id changes.
                @param location_id: Location id
                @param product: Changed product_id
                @param uom: UoM product
                @return:  Dictionary of changed values
                """
                context = {} if context is None else context
                if not product:
                    return {'value': {'product_qty': 0.0, 'product_uom': False, 'prod_lot_id': False}}
                obj_product = self.pool.get('product.product').browse(cr, uid, product, context=context)
                uom = uom or obj_product.uom_id.id
                amount = self.pool.get('stock.location')._product_get(cr, uid, location_id, [product], {'uom': uom, 'to_date': to_date, 'compute_child': False})[product]
                result = {'product_qty': amount, 'product_uom': uom, 'prod_lot_id': False,'qty_available':obj_product.qty_available}
                return {'value': result}

        注:原函数self.pool.get('product.product').browse 没有传递 context , 这就应该是所谓的丢失 context 吧

        2、带来的问题
        stock.inventory.line.qty_available 字段定义默认 store=False 的,那么如果是read stock.inventory 对象,这时没有触发 onchange 事件。那怎么办?建议是修改字段定义 store = True

        'qty_available': fields.related('product_id','qty_available',type='float',string='Qty Available', store=True),


        3、为毛 <field name="qty_available" context="{'location': location_id, 'to_date': parent.date}" /> 定义的 context 木有用?

        其实context 的用法并不多
        1、widget  有 model dataset 的,
        a) 默认值用法。可设置默认值default_xxx/搜索默认值search_default_xxx
        b) 该 model 的 orm 用法,如 name_search 方法等

        2、 on_change_xxx 用法
        <field name="xxx" context="{'xxx': xxx}"  on_change="on_change_xxx(a,bc,c, context)/>


        回到stock.inventory.line.qty_available 字段,该字段在JS端会被解析为 instance.web.form.FieldFloat widget , 无model 无dataset ,你说context 给它有啥用呢。。。。



        欢迎讨论 ~

        1 条回复 最后回复
        0
        • W 离线
          W 离线
          wangbuke
          写于 最后由 编辑
          #4

          再次回到需求,,,

          [quote]目的是, 在录入盘点单的时候, 参得到该产品在 盘点时刻 对应的库位上 的在手数量[/quote]

          其实我觉得更好的实现是用 qty_available 使用 function fileld 来实现, 对于 stock.inventory.line 来说,location 和 to_date 都是已知的。

          这样的话,每一行都会单独计算,就不必纠结 store=True/False 的问题了。

          1 条回复 最后回复
          0
          • C 离线
            C 离线
            ccdos
            写于 最后由 编辑
            #5

            不明觉历,留名 备查

            1 条回复 最后回复
            0
            • mrshellyM 离线
              mrshellyM 离线
              mrshelly
              写于 最后由 编辑
              #6

              保存单据, 再重新打开.. .看看字段数据...

              1 条回复 最后回复
              0
              • mrshellyM 离线
                mrshellyM 离线
                mrshelly
                写于 最后由 编辑
                #7

                on_change 事件里可以得到 context..

                打开单据后, 单据的 one2many 字段, 并没有得到传入的 context 导致 数量未按预想的计算.

                1 条回复 最后回复
                0

                • 登录

                • 没有帐号? 注册

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