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

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

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

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

One2many 还是丢了 context ?



  • 重庆-mrshelly(49812643) 16:35:47 <br />广州-步科(17779104)  15:20:00<br />重庆-mrshelly(49812643) 13:09:29 <br />但是 one2many 还是丢了 context 的.<br /><br />@重庆-mrshelly ,总监能否发个贴 ~ ,给个具体案例,这样木有上下文的。。。<br /><br />臣妾看不懂啊 ~<br /><br /><br /><br />最简单的需求例子:<br /><br />在 盘点单明细上 related 产品的 qty_available 并 stored=False<br />目的是, 在录入盘点单的时候, 参得到该产品在 盘点时刻 对应的库位上 的在手数量<br /><br /><br />然后 因为要得到该库位在该时刻的该产品 的在手数量, 就需要将 盘点单 的日期, 与 明细表的 库位 这两个信息用 context 传递下去.<br /><br /><br />所以, 就在 盘点单明细(stock.inventory.line) 的 qty_available 字段上添加 context<br /><br /><field name="qty_available" context="{'location': location_id, 'to_date': parent.date}" /><br /><br /><br />然后 在 产品(product.product) 的 qty_available function 字段上断点, 看 context 的值.<br /><br />



  • 重庆-mrshelly(49812643) 16:35:47 <br />广州-步科(17779104)  15:20:00<br />重庆-mrshelly(49812643) 13:09:29 <br />但是 one2many 还是丢了 context 的.<br /><br />@重庆-mrshelly ,总监能否发个贴 ~ ,给个具体案例,这样木有上下文的。。。<br /><br />臣妾看不懂啊 ~<br /><br /><br /><br />最简单的需求例子:<br /><br />在 盘点单明细上 related 产品的 qty_available 并 stored=False<br />目的是, 在录入盘点单的时候, 参得到该产品在 盘点时刻 对应的库位上 的在手数量<br /><br /><br />然后 因为要得到该库位在该时刻的该产品 的在手数量, 就需要将 盘点单 的日期, 与 明细表的 库位 这两个信息用 context 传递下去.<br /><br /><br />所以, 就在 盘点单明细(stock.inventory.line) 的 qty_available 字段上添加 context<br /><br /><field name="qty_available" context="{'location': location_id, 'to_date': parent.date}" /><br /><br /><br />然后 在 产品(product.product) 的 qty_available function 字段上断点, 看 context 的值.<br /><br />



  • 根据总监的意思,写了个小模块,详情请下载附件。部分代码如下:<br /><br />stock.py<br />[code]<br /><br />from openerp.osv import osv, fields<br /><br />class stock_inventory_line(osv.osv):<br />    _inherit = "stock.inventory.line"<br />    _columns = {<br />        'qty_available': fields.related('product_id','qty_available',type='float',string='Qty Available'),<br />    }<br /><br />[/code]<br /><br />stock_view.xml<br /><br />[code]<br /><br />        <record model="ir.ui.view" id="view_inventory_qty_form"><br />            <field name="name">stock.inventory.form</field><br />            <field name="model">stock.inventory</field><br />            <field name="inherit_id" ref="stock.view_inventory_form" /><br />            <field name="arch" type="xml"><br />                <field name="product_qty" position="after"><br />                    <field name="qty_available" context="{'location': location_id, 'to_date': parent.date}" /><br />                </field><br />            </field><br />        </record><br /><br />[/code]



  • 首先说明下:上一贴和附件的代码,都是没能实现需求的。。。。 8)<br /><br />1、需求<br />[quote]目的是, 在录入盘点单的时候, 参得到该产品在 盘点时刻 对应的库位上 的在手数量[/quote]<br /><br />理所当然是采用onchange来运算嘛, 修改 product_id view 如下:<br /><br /><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')]"/><br /><br />注:on_change_product_id 加了 context 参数,因此 on_change_product_id 也必须改改:<br />    def on_change_product_id(self, cr, uid, ids, location_id, product, uom=False, to_date=False, context=None):<br />        """ Changes UoM and name if product_id changes.<br />        @param location_id: Location id<br />        @param product: Changed product_id<br />        @param uom: UoM product<br />        @return:  Dictionary of changed values<br />        """<br />        context = {} if context is None else context<br />        if not product:<br />            return {'value': {'product_qty': 0.0, 'product_uom': False, 'prod_lot_id': False}}<br />        obj_product = self.pool.get('product.product').browse(cr, uid, product, context=context)<br />        uom = uom or obj_product.uom_id.id<br />        amount = self.pool.get('stock.location')._product_get(cr, uid, location_id, [product], {'uom': uom, 'to_date': to_date, 'compute_child': False})[product]<br />        result = {'product_qty': amount, 'product_uom': uom, 'prod_lot_id': False,'qty_available':obj_product.qty_available}<br />        return {'value': result}<br /><br />注:原函数self.pool.get('product.product').browse 没有传递 context , 这就应该是所谓的丢失 context 吧<br /><br />2、带来的问题<br />stock.inventory.line.qty_available 字段定义默认 store=False 的,那么如果是read stock.inventory 对象,这时没有触发 onchange 事件。那怎么办?建议是修改字段定义 store = True<br /><br />'qty_available': fields.related('product_id','qty_available',type='float',string='Qty Available', store=True),<br /><br /><br />3、为毛 <field name="qty_available" context="{'location': location_id, 'to_date': parent.date}" /> 定义的 context 木有用?<br /><br />其实context 的用法并不多<br />1、widget  有 model dataset 的,<br />a) 默认值用法。可设置默认值default_xxx/搜索默认值search_default_xxx<br />b) 该 model 的 orm 用法,如 name_search 方法等<br /><br />2、 on_change_xxx 用法<br /><field name="xxx" context="{'xxx': xxx}"  on_change="on_change_xxx(a,bc,c, context)/> <br /><br /><br />回到stock.inventory.line.qty_available 字段,该字段在JS端会被解析为 instance.web.form.FieldFloat widget , 无model 无dataset ,你说context 给它有啥用呢。。。。<br /><br /><br /><br />欢迎讨论 ~



  • 再次回到需求,,,<br /><br />[quote]目的是, 在录入盘点单的时候, 参得到该产品在 盘点时刻 对应的库位上 的在手数量[/quote]<br /><br />其实我觉得更好的实现是用 qty_available 使用 function fileld 来实现, 对于 stock.inventory.line 来说,location 和 to_date 都是已知的。<br /><br />这样的话,每一行都会单独计算,就不必纠结 store=True/False 的问题了。



  • 不明觉历,留名 备查



  • 保存单据, 再重新打开.. .看看字段数据...<br /><br />



  • on_change 事件里可以得到 context..<br /><br />打开单据后, 单据的 one2many 字段, 并没有得到传入的 context 导致 数量未按预想的计算.


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待