odoo 绕过点击按钮时对required字段的校验


           最近项目中遇到一个问题,模型对象是通过代码创建的,其中有的required字段创建时没有没有数据,创建后模型对像为draft状态。

通过菜单进入该模型的form视图,点击取消或者其他按钮,会对required字段进行校验,因为创建时,required字段没有数据。

           因为需求有可以直接取消该对象,所以不能直接点击取消按钮,需要进入编辑模式,把没有数据required字段都填上数据保存后,才能

点击取消按钮,或者其他按钮。要取消该对象,去填写了required字段数据就没有意义,所以不合理。现在需要直接点击取消按钮,就取消掉

该对象,那么就需要取消点击按钮时,对required字段的校验。

         那么现在我们就来实现这个功能,通过研究主要需要修改的2个地方。

         步骤一:需要在菜单对应的action中的context添加invalid_required:True

         地方一:web/static/src/js/view_form.js 的_process_save方法中对原有逻辑进行修改,修改代码如下:

        

_process_save: function(save_obj) {
        var self = this;
        var prepend_on_create = save_obj.prepend_on_create;
        try {
            var form_invalid = false,
                values = {},
                first_invalid_field = null,
                readonly_values = {};
            for (var f in self.fields) {
                if (!self.fields.hasOwnProperty(f)) { continue; }
                f = self.fields[f];
                if (!f.is_valid() && !self.ViewManager.dataset.context.invalid_required) {
                    form_invalid = true;
                    if (!first_invalid_field) {
                        first_invalid_field = f;
                    }
                } else if (f.name !== 'id' && (!self.datarecord.id || f._dirty_flag)) {
                    // Special case 'id' field, do not save this field
                    // on 'create' : save all non readonly fields
                    // on 'edit' : save non readonly modified fields
                    if (!f.get("readonly")) {
                        values[f.name] = f.get_value();
                    } else {
                        readonly_values[f.name] = f.get_value();
                    }
                }
            }
            if (form_invalid) {
                self.set({'display_invalid_fields': true});
                first_invalid_field.focus();
                self.on_invalid();
                return $.Deferred().reject();
            } else {
                self.set({'display_invalid_fields': false});
                var save_deferral;
                if (!self.datarecord.id) {
                    // Creation save
                    save_deferral = self.dataset.create(values, {readonly_fields: readonly_values}).then(function(r) {
                        return self.record_created(r, prepend_on_create);
                    }, null);
                } else if (_.isEmpty(values)) {
                    // Not dirty, noop save
                    save_deferral = $.Deferred().resolve({}).promise();
                } else {
                    // Write save
                    save_deferral = self.dataset.write(self.datarecord.id, values, {readonly_fields: readonly_values}).then(function(r) {
                        return self.record_saved(r);
                    }, null);
                }
                return save_deferral;
            }
        } catch (e) {
            console.error(e);
            return $.Deferred().reject();
        }
    },

   把其中的if(!f.is_valid()) 修改为if (!f.is_valid() && !self.ViewManager.dataset.context.invalid_required), 这样修改后,添加了invalid_required:True的菜单下的button都不会去对required字段的校验。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值