如何仅显示选择字段的选项子集?

问题描述 投票:0回答:1

我正在使用 Odoo v17。我扩展了 account.move 模型以包含“serie”字段

class AccountMove(models.Model):
    _inherit = "account.move"

    serie = fields.Selection([
        ('a', 'A'),
        ('e', 'E'),
        ('f', 'F'),
        ('g', 'G'),  
        ('i', 'I'),      
        ('cp', 'CP'),
        ], string='Serie', required=True, default='a')

代码已投入生产并创建了几张发票。现在需要删除该字段的一些选项。选项“e”、“f”、“g”将不再可用。但是,仅从字段中删除这些选项会导致在访问之前创建的包含“e”、“f”或“g”系列的发票时出现错误。因此,我决定保持字段定义不变,但修改小部件以仅显示选项“a”、“i”、“cp”。 使用以下代码,我能够实现仅在系列字段中显示选项“a”、“i”、“cp”。但是,当我尝试打开之前使用系列 = 'e'、'f'、'g' 创建的发票时,它显示错误。 这是代码:

/** @odoo-module **/

import {registry} from "@web/core/registry";

import {
  SelectionField,
  selectionField,
} from "@web/views/fields/selection/selection_field";

export class FilteredSerieSelection extends SelectionField {
  get availableOptions() {
    return ['a','i','cp'];
  }

  /** Override **/
  get options() {
    const availableOptions = this.availableOptions;
    return super.options.filter((x) => availableOptions.includes(x[0]));
  }
}

registry.category("fields").add("custom_serie_select", {
  ...selectionField,
  component: FilteredSerieSelection,
});

视图中:

<?xml version="1.0" encoding="utf-8" ?>
<odoo>
    <record id="account_move_viixoo_form_inherited" model="ir.ui.view">
        <field name="name">account.move.viixoo.form.inherit</field>
        <field name="model">account.move</field>
        <field name="inherit_id" ref="account.view_move_form" />
        <field name="arch" type="xml">
            <field name="l10n_mx_edi_usage" position="after">
                <field name="serie"  widget="custom_serie_select" required="move_type == 'out_invoice'" invisible="move_type != 'out_invoice'" readonly="id != False and name != '/'"/>
            </field>
        </field>
    </record>
</odoo>

这是显示的错误:

OwlError: An error occured in the owl lifecycle (see this Error's "cause" property)
    OwlError@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:684:1
    handleError@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:916:101
    handleError@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:1542:29
    _render@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:941:19
    render@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:939:6
    initiateRender@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:1007:47

Caused by: TypeError: this.options.find(...) is undefined
    get string@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:8386:224
    template@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js line 1500 > Function:15:18
    _render@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:940:96
    render@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:939:6
    initiateRender@http://127.0.0.1:8069/web/assets/a3292ec/web.assets_web.min.js:1007:47

创建新发票时,所需选项会正确显示,不会出现错误。 Serie is showing only options a, i, cp

我需要能够仅显示这些选项,但对于之前创建的发票,它应该显示系列“e”、“f”、“g”而不会出现错误。

odoo odoo-17 odoo-owl
1个回答
0
投票

如果您想在下拉列表或状态栏中显示特定选项,同时仍允许后端存在其他状态,则可以使用 statusbar_visible。

以下是您如何在您的案例中使用它:

statusbar_visible 示例: 仅使特定状态('a'、'i'、'cp')在状态栏中可见:

代码:

<record id="view_move_form" model="ir.ui.view">
<field name="name">account.move.form</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form" />
<field name="arch" type="xml">
    <field name="serie" position="attributes">
        <attribute name="widget">statusbar</attribute>
        <attribute name="statusbar_visible">a,i,cp</attribute>
    </field>
</field>
© www.soinside.com 2019 - 2024. All rights reserved.