我正在使用 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
我需要能够仅显示这些选项,但对于之前创建的发票,它应该显示系列“e”、“f”、“g”而不会出现错误。
如果您想在下拉列表或状态栏中显示特定选项,同时仍允许后端存在其他状态,则可以使用 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>