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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow