odoo-8
RPC mit Odoo v8 API (Python-Funktion von JavaScript aus aufrufen)
Suche…
Bemerkungen
Wenn Sie erwägen, neue Methoden in Python hinzuzufügen, um sie in RPC von JavaScript aus zu verwenden, sollten Sie die folgenden Optionen von Methodendekoratoren in Betracht ziehen: Wenn Sie mit IDs / Recordsets arbeiten müssen, wählen Sie für die Definition der Python-Methode den Dekorator:
- @ api.multi - um Recordset in Ihrer Methode zu erhalten
- @ api.one - zum Durchsuchen von browse_records nacheinander in Ihrer Methode in den obigen Beispielen @ api.multi wird verwendet, aber @ api.one kann je nach Anforderungen auch für den Umgang mit IDs verwendet werden (es wird jedoch dringend empfohlen, @ zu verwenden. api.multi anstelle von @ api.one (aus Performancegründen).
Oder wenn es eine einfache Funktion ist, die sich nicht mit Datensätzen / IDs befassen muss, dann wählen Sie für die Python-Methode den Dekorator:
- @ api.model - Erlaubt Höflichkeit mit der alten API.
- @ api.multi - Auch hier kannst du es verwenden, einfach
[ ]
(leeres Array) als erstes Argument in Javascript übergeben ...
Referenzen: Odoo RPC-Dokumentation , Odoo 8 API-Methodendekorateure
Ein Beispiel für ein Odoo-Modell, aus dem Methoden aufgerufen werden
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)
Odoo RPC-Beispiele
Die folgenden Beispiele zeigen, wie die Python-Funktion von JavaScript in Odoo 8 aufgerufen wird. In den Beispielen rufen wir Methoden von my_model auf, die bereits auf dieser Seite beschrieben wurden.
In den folgenden Beispielen wird davon ausgegangen, dass die Variable "list_of_ids" eine Liste (Array) von IDs vorhandener Datensätze des Modells "my.model" enthält.
- Aufruf der Methode foo_manipulate_records_1 mit @ api.multi :
new instance.web.Model("my.model") .call( "foo_manipulate_records_1", [list_of_ids]) .then(function (result) { // do something with result });
- Aufruf der Methode foo_manipulate_records_2, die mit @ api.multi dekoriert ist:
new instance.web.Model("my.model") .call( "foo_manipulate_records_2", [list_of_ids, arg1, arg2]) .then(function (result) { // do something with result });
- Aufruf der Methode bar_no_deal_with_ids mit @ api.model :
new instance.web.Model("my.model") .call( "bar_no_deal_with_ids", [arg1, arg2]) .then(function (result) { // do something with result });
Auch wenn dies je nach Implementierung sinnvoll ist, können Sie die mit @ api.multi dekorierte Funktion aufrufen, auch wenn Sie sich nicht mit IDs befassen müssen (übergeben Sie einfach ein leeres Array anstelle von IDs als erstes Element der Argumentliste):
new instance.web.Model("my.model") .call( "foo_manipulate_records_2", [[], arg1, arg2]) .then(function (result) { // do something with result });
Dieser Weg kann in einigen Fällen nützlich sein, da die undekorierte Funktion in v8.0 api als @ api.multi betrachtet wird (da @ api.multi ein Standarddekorateur ist).
Abgesehen von zwei Parametern für den RPC-Aufruf, die in den obigen Beispielen verwendet werden (Funktionsname und Argumentliste), können Sie den dritten Parameter verwenden - ein Wörterbuch mit Schlüsselwortargumenten . Es wird dringend empfohlen, einen Kontext umzukehren (in manchen Fällen kann dies sogar notwendig sein), da sich dadurch das Verhalten von Remoteprozeduren (Lokalisierung usw.) ändern kann. Siehe das Beispiel mit Kontextargument in RPC-Aufruf (das gleiche gilt für alle obigen Beispiele).
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
});
Natürlich können Sie bei Bedarf auch einen benutzerdefinierten Kontext verwenden, anstatt den vorhandenen Kontext wie in diesem Beispiel umzudrehen.