One2many 还是丢了 context ?
-
重庆-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 的值. -
根据总监的意思,写了个小模块,详情请下载附件。部分代码如下:
stock.py<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 />
stock_view.xml<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 />
-
首先说明下:上一贴和附件的代码,都是没能实现需求的。。。。
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','<>','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 给它有啥用呢。。。。
欢迎讨论 ~