当记录具有特定状态时,如何使 Odoo 表单只读?

How to make Odoo form readonly when the record has an specific state?

我在 Odoo 中有一个实体“付款”,它有多个状态。当付款状态为“已付款”时,我想以只读模式(禁用编辑按钮)打开付款形式。我该怎么做?

您需要创建一个新的表单,其开头如下:

<!-- consider the xml id for this form view is small_module.my_custom_form -->
<form create="false" edit="false">
</form>

那么在你的行动中你会调用这样的表格。

<record id="my_custom_action" model="ir.actions.act_window">
    <field name="name">The Best Action</field>
    <field name="res_model">custom.model.action</field>
    <field name="view_type">form</field>
    <field name="view_mode">tree,form</field>
    <field name="view_id" ref="small_module.my_custom_form"/>
</record>

或者您可以 return 在 Python 方法中执行此类操作。

return {
    'type': 'ir.actions.act_window',
    'name': _('The Best Action'),
    'view_type': 'form',
    'view_mode': 'tree,form',
    'res_model': 'custom.model.action',
    'view_id': self.env.ref('small_module.my_custom_form').id,
}

正确的方法是给所有的字段加上只读属性,像这样:

<field name="my_field" attrs="{'readonly':[('state','=','paid')]}"/>

但如果您仍想隐藏编辑按钮,则需要覆盖表单控制器,方法如下:

  1. 在您的模块静态文件夹中创建一个 javascript 文件: my_module/static/src/js/my_form_view.js
  2. 在 my_form_view.js 中添加:
odoo.define('my_module.MyCustomForm', function (require) {
"use strict";

    var FormController = require('web.FormController');
    var viewRegistry = require('web.view_registry');
    var FormView = require('web.FormView');

    var MyFormController = FormController.extend({
        _updateButtons: function () {
            this._super.apply(this, arguments);
            if (this.$buttons) {
                if (this.renderer.state.data.state !== 'paid'){
                    this.$buttons.find('.o_form_button_edit').show();
                } else {
                    this.$buttons.find('.o_form_button_edit').hide();
                }
            }            
        },

    });

    var MyFormView = FormView.extend({
        config: _.extend({}, FormView.prototype.config, {
            Controller: MyFormController,
        }),
    });
    viewRegistry.add('custom_form', MyFormView);

});
  1. 通过创建一个新文件 my_module/views/asset.xml 将您的 js 脚本添加到资产后端,内容应为:
<?xml version="1.0"?>
<odoo>

    <template id="assets_backend" name="my_backend_assets" inherit_id="web.assets_backend">
        <xpath expr="." position="inside">
            <script type="text/javascript" src="/my_module/static/src/js/my_form_view.js" />
        </xpath>
    </template>

</odoo>
  1. 您还需要将自定义表单视图添加到表单视图中,像这样
<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="my_model_form_view" model="ir.ui.view">
        <field name="name">my.model.form</field>
        <field name="model">my.model</field>
        <field name="arch" type="xml">
            <form js_class="custom_form">
            ... your form contents
            </form>
        </field>
    </record>
        
</odoo>