Чтобы обновить значение поля, вам нужно вызвать событие Odoo field_change
, передавая идентификатор записи, который вы хотите изменить, и поле, которое будет изменено вместе с некоторыми опциями для других полей:
// this is the widget object
this.trigger_up('field_changed',
dataPointID: this.dataPointID,
changes: changes, // change is an object {field_name: value, other_field_name: value}
viewType: this.viewType});
Это событие обрабатывается BasicModel
в конце для обновления каждой записи.
В вашем примере все сложнее, потому что вы хотите go из поля вашего one2many в родительскую модель, к сожалению, в У виджета поля вопроса у нас нет идентификатора родительской записи, только идентификатор модели страницы или как там называется. поэтому я использовал новое пользовательское событие odoo (я назвал его badge_clicked
) для обработки его из родительского виджета (One2many field widget
), в этом виджете у нас есть идентификатор родительской записи. Надеюсь, что комментарии проясняют для вас вещи:
/*
Handle event trigged by the method that handle the badge click event
*/
FieldX2Many.include({
custom_events: _.extend({}, FieldX2Many.prototype.custom_events, {
badge_clicked: '_OnBadgeClicked',
}),
_OnBadgeClicked : function(ev){
// do this only in edit mode
if (this.mode != 'edit')
return undefined;
var result = ev.data.result;
var changes = {};
// this will trigger an update on the field it self,
// odoo will wait for the type of operation
//Display Question In question field ( I don't know the field names)
// Very Big Note: the values must be valid you cannot give an interger value to char field for example
changes['field_name'] = result['question'];
changes['some_other_field'] = result['some_ther_field_to_set'];
// if you want to check some field of the current record don't use JQuery to retrieve the value use the record attribute of the widget.
// if (this.record.data['some_field'] === 'some_value'){
// do some thing
// }
// this is required(a dummy update to avoid unexpected behavior by the field_changed event)
changes[this.name] = {
operation: 'UPDATE',
id: ev.data.dataPointID,
changes: {} };
// we did all of this just to trigger the field_changed from the One2many field because in the many2many tags we don't have the ID of the parent record.
this.trigger_up('field_changed', {
dataPointID: this.dataPointID, // here the ID is the parent(global) record
changes: changes,
viewType: this.viewType});
},
});
/*
Handle click event to inform the parent widget.
*/
FieldMany2ManyTags.include({
events: _.extend({}, FieldMany2ManyTags.prototype.events, {
'click .badge': '_onClickTag',
}),
_onClickTag: function(event){
var self = this;
event.preventDefault();
event.stopPropagation();
// deactivate this for other model.
// I tried the same thing with account.invoice and it worked perfectly
// I don't know the name of the model in your one2many field in my case is invoice.line ^^
if (self.model != 'account.invoice.line')
return undefined;
var self = this;
var id = $(event.target).parent().data('id');
var data = this._rpc({
model: 'survey.survey',
method: 'get_id',
args: [id],
}).then(function (result) {
// trigger an event that will be handled by the parent widget
self.trigger_up('badge_clicked', {
result: result,
// when we click the One2many field in edit mode, a field_change will be trigger
// we need the ID of this record to trigger a dummy update
dataPointID: self.dataPointID, // here the ID is the record in the line of one2many field and we don't have the ID of the parent record at this point this why we are triggering this event to be handled by the one2many
});
}
},
});
Примечание : я попробовал это, и это сработало отлично. Я изменил поле comment
модели счета, нажав на теги tax
Идея состоит в том, чтобы вызвать событие Odoo из обработчика события click и обработать это событие у родительского виджета-ведьмы one2many
, чтобы иметь возможность вызвать событие field_change
, используя правильный ID
. Я надеюсь, вам это поможет