最近项目中遇到一个问题,模型对象是通过代码创建的,其中有的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字段的校验。