odoo-8
RPC przy użyciu interfejsu API Odoo v8 (wywołanie funkcji Python z JavaScript)
Szukaj…
Uwagi
Jeśli zastanawiasz się nad dodaniem nowych metod w Pythonie, aby używać ich w RPC z JavaScript, rozważ następujące opcje dekoratorów metod: jeśli masz do czynienia z identyfikatorami / zestawami rekordów, wybierz definicję dekoratora dla definicji metody python:
- @ api.multi - aby uzyskać zestaw rekordów w twojej metodzie
- @ api.one - aby uzyskać browse_records jeden po drugim w swojej metody w powyższych przykładach @ api.multi jest używany, ale @ api.one może być również używany do czynienia z identyfikatorów, w zależności od potrzeb (jakkolwiek, to zaleca się stosowanie @ api.multi zamiast @ api.one ze względu na wydajność).
Lub jeśli jest to prosta funkcja, która nie musi zajmować się rekordami / identyfikatorami, wówczas dla metody python wybierz dekorator:
- @ api.model - Pozwala być uprzejmym dzięki API starego stylu.
- @ api.multi - Znowu możesz użyć go tutaj, po prostu przekaż
[ ]
(pusta tablica) jako pierwszy argument w javascript ...
Odnośniki: dokumentacja Odoo RPC , dekoratory metod API Odoo 8
Przykładowy model Odoo do wywoływania metod
class my_model(models.Model):
_name = "my.model"
name = fields.Char('Name')
@api.multi
def foo_manipulate_records_1(self):
""" function returns list of tuples (id,name) """
return [(i.id,i.name) for i in self]
@api.multi
def foo_manipulate_records_2(self, arg1, arg2)
#here you can take advantage of "self" recordset and same time use aditional arguments "arg1", "arg2"
pass
@api.model
def bar_no_deal_with_ids(self, arg1, arg2):
""" concatenate arg1 and arg2 """
return unicode(arg1) + unicode(arg2)
Przykłady Odoo RPC
Poniższe przykłady pokazują, jak wywoływać funkcję Python z JavaScript w Odoo 8. W przykładach nazywamy metody my_model opisane wcześniej na tej stronie.
Zakładamy, że w poniższych przykładach zmienna „list_of_ids” zawiera listę (tablicę) identyfikatorów istniejących rekordów modelu „my.model”.
- Wywołanie metody foo_manipulate_records_1 ozdobione @ api.multi :
new instance.web.Model("my.model") .call( "foo_manipulate_records_1", [list_of_ids]) .then(function (result) { // do something with result });
- Wywołanie metody foo_manipulate_records_2 ozdobione @ api.multi :
new instance.web.Model("my.model") .call( "foo_manipulate_records_2", [list_of_ids, arg1, arg2]) .then(function (result) { // do something with result });
- Wywołanie metody bar_no_deal_with_ids ozdobione @ api.model :
new instance.web.Model("my.model") .call( "bar_no_deal_with_ids", [arg1, arg2]) .then(function (result) { // do something with result });
Również jeśli ma to jakiś sens w zależności od implementacji, możesz wywołać funkcję ozdobioną @ api.multi, nawet jeśli nie masz do czynienia z identyfikatorami (wystarczy przekazać pustą tablicę zamiast identyfikatorów, jako pierwszy element listy argumentów):
new instance.web.Model("my.model") .call( "foo_manipulate_records_2", [[], arg1, arg2]) .then(function (result) { // do something with result });
ten sposób może być użyteczny w niektórych przypadkach, ponieważ funkcja nieudokumentowana w API 8.0 jest uważana za @ api.multi (ponieważ @ api.multi jest domyślnym dekoratorem)
Oprócz dwóch parametrów wywołania RPC, które są używane w powyższych przykładach (nazwa funkcji i lista argumentów), można użyć trzeciego parametru - słownika argumentów słów kluczowych . Zdecydowanie zaleca się odwrócenie kontekstu (w niektórych przypadkach może to być nawet konieczne), ponieważ może to zmienić zachowanie procedury zdalnej (lokalizacja itp.). Zobacz poniższy przykład z argumentem kontekstu w wywołaniu RPC (to samo można zastosować do wszystkich powyższych przykładów)
var self = this;
new instance.web.Model("my.model")
.call("foo_manipulate_records_2", [[], arg1, arg2], {'context':self.session.user_context})
.then(function (result) {
// do something with result
});
Oczywiście, jeśli to konieczne, możesz również użyć niestandardowego kontekstu, zamiast odwracać istniejący, jak w tym przykładzie.