Sök…


Anmärkningar

Om du funderar på att lägga till nya metoder i Python för att använda dem i RPC från JavaScript, kan du överväga följande alternativ för metoddekoratörer: om du har att hantera id: er / recordsets, välj dekoratör för pythonmetoddefinition:

  • @ api.multi - för att få inspelning i din metod
  • @ api.one - för att få browse_records en och en i din metod i ovanstående exempel används @ api.multi, men @ api.one kan också användas för att hantera id: er, beroende på krav (Det rekommenderas dock starkt att använda @ api.multi istället för @ api.one av prestandaskäl).

Eller om det är en enkel funktion som inte behöver hantera poster / ID: er för pythonmetod väljer du dekoratör:

  • @ api.model - Tillåter att vara artig med gammal stil API.
  • @ api.multi - Återigen kan du använda det här också, bara skicka [ ] (tom matris) som första argument i javascript ...

Referenser: Odoo RPC-dokumentation , Odoo 8 API-metodinredare

Ett exempel på Odoo-modell att använda metoder från

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-exempel

Exempel nedan visar hur man kan ringa Python-funktion från JavaScript i Odoo 8. I exemplen kallar vi metoder för my_model som beskrivs tidigt på denna sida.
Vi antar att i följande exempel innehåller "list_of_ids" -variabeln lista (array) av id: er för befintliga poster i "my.model" -modellen.

  • Call of method foo_manipulate_records_1 dekorerad med @ api.multi :
    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_1", [list_of_ids])
            .then(function (result) {
                // do something with result
        });

  • Metodets anrop foo_manipulate_records_2 dekorerad med @ 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
        });

  • Metodens anrop bar_no_deal_with_ids dekorerad med @ api.model :
    new instance.web.Model("my.model")
        .call( "bar_no_deal_with_ids", [arg1, arg2])
            .then(function (result) {
                // do something with result
        });

Om det också har någon mening beroende på implementering, kan du ringa funktion dekorerad med @ api.multi även om du inte behöver ta itu med id: er (bara skicka tom array istället för id, som första element i argumentlistan):

    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_2", [[], arg1, arg2])
            .then(function (result) {
                // do something with result
        });

detta sätt kan vara användbart i vissa fall, eftersom okoraterad funktion i v8.0 api betraktas som @ api.multi (eftersom @ api.multi är en standard dekoratör)

Med undantag av två parametrar för RPC-samtal som används i ovanstående exempel (funktionsnamnet och argumentlistan), kan du använda den tredje parametern - en ordlista med sökordargument . Det rekommenderas starkt att vända ett sammanhang (i vissa fall kan det till och med vara nödvändigt), eftersom det kan förändra beteendet för fjärrproceduren (lokalisering etc.). Se nedan exemplet med kontextargument i RPC-samtal (samma kan tillämpas på alla exempel ovan)

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
    });

Naturligtvis kan du använda anpassat sammanhang också, om det behövs, istället för att vända det existerande som i detta exempel.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow