奥多。 returns 列出的功能字段

Odoo. Function field that returns list

我们正在尝试创建呈现为列表的 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个字:在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], 
    }

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

_columns = { 
        'order_ids': fields.function(_orders, string="Sale Orders", type="many2many", relation='sale.order'),
    }
  1. 函数字段的方法总是return一个字典。在您的情况下,由于未指定 'multi' 属性,因此方法应该 return 带有记录 ID 的字典,您已将功能字段添加为键并将结果添加为值。这里的值是销售订单列表ids.For示例。

    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