Odoo。返回列表的函数字段

时间:2015-02-02 12:47:48

标签: python openerp odoo

我们正在尝试创建odoo函数字段,将其呈现为列表。

我们遵循以下模式:

class sale_wizard(orm.TransientModel):
    _name = 'account.bank.statement.review.wizard'


    def _orders(self, cr, uid, ids, fields, arg, context=None):
        statement = self.env['account.bank.statement'].browse(self._context.get('active_id'))
        partner_id = statement.partner_id.id
        sale_orders = self.pool.get('sale.order').search(cr, uid, [
            ('partner_id', '=', partner_id),
        ])
        print 'hiro'
        print sale_orders
        return [(1,2,3), (1,2,3)]


    _columns = { 
        'order_ids': fields.function(_orders, string="Sale Orders", type="many2many"),
    }

我们遵循以下观点:

    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
        <data>
            <!-- Wizard Form -->
            <record model="ir.ui.view" id="orders_review_form">
                <field name="name">Sale Orders Review</field>
                <field name="model">account.bank.statement.review.wizard</field>
                <field name="arch" type="xml">
                    <form string="Sale Orders Test">
                        <group col="2">
                            <field name="order_ids" />
                        </group>
                    </form>
                </field>
            </record>
        </data>
    </openerp>

当我打开表单时,它包含视图 - 它呈现为空列表。和行

print 'hiro'
print sale_orders

不要执行。因此,函数字段order_ids不执行函数orders

在哪里挖?

UPD 在其他模块中 - 函数字段按预期工作并在模型初始化时执行。

2 个答案:

答案 0 :(得分:4)

您的代码中存在一些问题。 1.定义功能字段时,需要提供关系模型。这里的关系是sale.order。所以

_columns = { 
        'order_ids': fields.function(_orders, string="Sale Orders", type="many2many", relation='sale.order'),
    }
  1. 功能字段的方法总是返回字典。在您的情况下,作为&#39; multi&#39;如果未指定attribute,则该方法应返回id为record的字典,其中已将功能字段添加为键,结果为value。这里的值是销售订单ID列表。例如。

    def _orders(self, cr, uid, ids, fields, arg, context=None):
        res = {}
        for _obj in self.browse(cr, uid, ids, context=context):
            _orders = _order_pool.search(cr, uid, [('partner_id', '=', statement.partner_id.id), ], context=context)
            res[_obj.id] =_orders
        return res
    

答案 1 :(得分:1)

用2个词:在 odoo 8 中,功能字段被计算字段替换。

因此,将模型代码更改为以下内容:

class sale_wizard(orm.TransientModel):
    _name = 'account.bank.statement.review.wizard'

    def _orders(self, cr, uid, ids, fields, arg, context=None):

        res = {}
        _statement = self.pool.get('account.bank.statement')
        statement = _statement.browse(cr, uid, context.get('active_id', False), context=context)
        _order_pool = self.pool.get('sale.order')

        if statement:
             for _obj in self.browse(cr, uid, ids, context=context):
                _orders = _order_pool.search(cr, uid, [('partner_id', '=', statement.partner_id.id), ], context=context)
                res[_obj.id] = [(6, 0, _orders)]

        return res

    _columns = { 
        'order_ids': fields.many2many('sale.order', string="Sale Orders", compute='_orders'),
    }


    _defaults = {
        #dirty trick to set values on wizard launch
        'order_ids': lambda self, cr, uid, context : self._orders(cr, uid, [0], '', '', context)[0], 
    }