计算选择字段不起作用

Mar*_*der 1 odoo odoo-10

我正在尝试创建一个选择字段,其中的值应该动态计算。声明是:

payment_mode = fields.Selection('_compute_selection', string="Payment mode", default="cash")
Run Code Online (Sandbox Code Playgroud)

和功能:

@api.model
def _compute_selection(self):
    context = dict(self._context or {})
    active_ids = context.get('active_ids')
    active_model = context.get('active_model')
    invoices = self.env[active_model].browse(active_ids)
    type_payment = MAP_INVOICE_TYPE_PARTNER_TYPE[invoices[0].type]
    if type_payment == "expense":
        if active_model == "account.invoice":
            payment_mode = [('cash', 'Cash'),
                ('idoklad', 'Internal'),
                ('transfer', 'Bank transfer')]
        else:
            payment_mode =  [('cash', 'Cash'),
                ('transfer', 'Bank transfer')]
    else:
        if active_model == "account.invoice":
            payment_mode = [('cash', 'Cash'),
                ('idoklad', 'Internal')]
        else:
            payment_mode = [('cash', 'Cash')]

    return payment_mode
Run Code Online (Sandbox Code Playgroud)

所见声明:

<field name="payment_mode" widget="radio" />
Run Code Online (Sandbox Code Playgroud)

但是,在模块升级时我收到此错误:

 File "/home/openuser/erp10/odoo/models.py", line 1079, in _validate_fields
raise ValidationError("%s\n\n%s" % (_("Error while validating constraint"), tools.ustr(e)))
ParseError: "Error while validating constraint

None
None" while parsing /home/openuser/erp10/addons/arn_payment/views/view.xml:3, near
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

tra*_*isw 5

我找不到任何相关文档,但我认为您只需要使用lambda您的selection属性,例如:

def _compute_selection(self):
    active_model = self._name
    type_payment = MAP_INVOICE_TYPE_PARTNER_TYPE[self[0].type]
    if type_payment == "expense":
        if active_model == "account.invoice":
            payment_mode = [('cash', 'Cash'),
                            ('idoklad', 'Internal'),
                            ('transfer', 'Bank transfer')]
        else:
            payment_mode = [('cash', 'Cash'),
                            ('transfer', 'Bank transfer')]
    else:
        if active_model == "account.invoice":
            payment_mode = [('cash', 'Cash'),
                            ('idoklad', 'Internal')]
        else:
            payment_mode = [('cash', 'Cash')]

    return payment_mode

payment_mode = fields.Selection(selection=lambda self: self._compute_selection(), string="Payment Mode", default="cash")
Run Code Online (Sandbox Code Playgroud)

_compute_selection注意:我已将您的方法更改为 not be@api.model并调整了您获取active_model和 的方式type_payment。这些改变可能适合你,也可能不适合你。

主要要点是用来selection=lambda self: self.method()获取动态选择值。