在這裏,我將改變odoo的默認behavor顯示使用此創建和編輯時,我想 :
<field name="many2one_field" options="{'create':true, 'quick_create':true}"/>
現在你的服裝模塊direcotry定義一個JavaScript文件來改變many2one小部件
you_costum_module_directory_name
--> static
--> src
--> js
--> costum_many2one_widget.js
JavaScript文件:
odoo.define('you_costum_module_directory_name.costum_many2one_widget' , function(require) {
// I hope that you know how to add this to odoo backendassets
// first we need core
var core = require('web.core');
// it's needed when we override get_search_result
var data = require('web.data');
// NOTE: i may forget to require some object in the code by mistake check it
// now we must get the many2one widget for form widget
var FieldMany2One = core.form_widget_registry.get('many2one');
// now we can override the method to change the behavor
FieldMany2one.include({
// if you want the search more to be always shown we must overrid
// get_search_result and we need to require every thing we need first like data object
// now to show search more always we must reimplement the
get_search_result: function(search_val) {
var self = this;
var dataset = new data.DataSet(this, this.field.relation, self.build_context());
this.last_query = search_val;
var exclusion_domain = [], ids_blacklist = this.get_search_blacklist();
if (!_(ids_blacklist).isEmpty()) {
exclusion_domain.push(['id', 'not in', ids_blacklist]);
}
return this.orderer.add(dataset.name_search(
search_val, new data.CompoundDomain(self.build_domain(), exclusion_domain),
'ilike', this.limit + 1, self.build_context())).then(function(_data) {
self.last_search = _data;
// possible selections for the m2o
var values = _.map(_data, function(x) {
x[1] = x[1].split("\n")[0];
return {
label: _.str.escapeHTML(x[1].trim()) || data.noDisplayContent,
value: x[1],
name: x[1],
id: x[0],
};
});
// show search more if there is only one element at least
// you can make it 0 if you want
if (values.length >= 1) {
values = values.slice(0, self.limit);
values.push({
label: _t("Search More..."),
action: function() {
dataset.name_search(search_val, self.build_domain(), 'ilike', 160).done(function(_data) {
self._search_create_popup("search", _data);
});
},
classname: 'o_m2o_dropdown_option'
});
}
// if the user provide an option quick_create show quick create
var raw_result = _(_data.result).map(function(x) {return x[1];});
if (
search_val.length > 0 &&
!_.include(raw_result, search_val) &&
self.options && self.options.quick_create
) {
self.can_create && values.push({
label: _.str.sprintf(_t('Create "<strong>%s</strong>"'),
$('<span />').text(search_val).html()),
action: function() {
self._quick_create(search_val);
},
classname: 'o_m2o_dropdown_option'
});
}
// if the user provide a create option show create and Edit option
if (self.options && self.options.create && self.can_create){
values.push({
label: _t("Create and Edit..."),
action: function() {
self._search_create_popup("form", undefined, self._create_context(search_val));
},
classname: 'o_m2o_dropdown_option'
});
}
else if (values.length === 0) {
values.push({
label: _t("No results to show..."),
action: function() {},
classname: 'o_m2o_dropdown_option'
});
}
return values;
});
}
});
// id don't know if this line is required or not
// but if we have to registre the widget again
core.form_widget_registry.add('many2one', FieldMany2One);
});
現在,你需要添加js文件到你backendassets模板
you_costum_module_directory_name
--> static
--> src
--> js
--> costum_many2one_widget.js
--> xml
--> widgets.xml
添加XML文件來體現:
<?xml version="1.0" encoding="utf-8" ?>
<openerp> <!-- odoo in odoo 10.0 -->
<data>
<!--We need to load our js file to backend_assets-->
<template id="assets_backend" name="many2one new edits " inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/you_costum_module_directory_name/static/src/js/costum_many2one_widget.js"></script>
</xpath>
</template>
</data>
</openerp>
在您的清單__openerp__.py
添加XML文件:
酷,它的工作原理和節省我的時間,謝謝兄弟... –