Szeto Consultants

Minta Saran: Passing Argumen dari JavaScript ke Method Python di Odoo 11

Minta Saran: Passing Argumen dari JavaScript ke Method Python di Odoo 11

Diposting pada 18 Apr 2026, 19:54
Ditanyakan oleh: Siska

Halo teman-teman praktisi Odoo! Siska di sini, lagi ada kendala nih di project Odoo 11.

Saya lagi develop fitur di mana ada custom button di client-side (view) yang perlu memanggil method di Python (server-side). Nah, method Python ini butuh beberapa argumen yang nilainya harus diambil dari data yang ada di UI atau field yang sedang aktif.

Secara teknis, saya bingung cara paling efektif dan Odoo-native untuk mengirimkan argumen-argumen tersebut dari JavaScript ke method Python yang dipanggil. Apakah ada cara khusus melalui `this._rpc` atau `session.rpc` yang direkomendasikan untuk Odoo 11, terutama saat kita perlu mengirimkan lebih dari satu atau dua argumen sederhana?

Mungkin teman-teman ada yang punya pengalaman atau best practice untuk kasus seperti ini? Mohon pencerahannya ya.

Terima kasih banyak sebelumnya atas bantuannya!

Balasan (1)

Admin Odoo ForumAdmin & AI Support18 Apr 2026, 19:54
Halo Mba Siska! Selamat datang di komunitas Odoo Indonesia. Wah, seru banget nih project-nya! Kendala seperti ini memang sering ditemui saat kita berinteraksi antara client-side (JavaScript) dan server-side (Python) di Odoo. Tapi jangan khawatir, ada cara yang cukup standar dan efektif untuk mengatasinya.

Untuk Odoo 11, pendekatan yang paling direkomendasikan dan Odoo-native adalah menggunakan `this._rpc` (jika Anda berada di dalam sebuah widget atau komponen Odoo web client) atau `session.rpc` (untuk kasus yang lebih jarang atau di luar konteks widget). Mengingat Anda di client-side view, kemungkinan besar Anda berada dalam konteks widget/component, jadi `this._rpc` adalah pilihan utama.

---

Begini cara paling efektif untuk mengirimkan argumen dari JavaScript ke method Python Anda, termasuk lebih dari satu argumen:

Pertama, di sisi JavaScript Anda, saat memanggil method Python, Anda bisa menggunakan struktur seperti ini:

`this._rpc({ ... }).then(...)`

Objek yang dilewatkan ke `this._rpc` harus berisi beberapa properti kunci:
`model`: Ini adalah nama teknis model Odoo (misalnya `'res.partner'`, `'nama.model.kamu'`) tempat method Python Anda berada.
`method`: Ini adalah nama method Python yang ingin Anda panggil.
`args`: Ini adalah properti yang paling penting untuk kasus Anda. Anda bisa mengirimkan array dari argumen yang ingin Anda kirimkan. Setiap elemen dalam array ini akan menjadi argumen posisi untuk method Python Anda.
`kwargs`: Jika Anda perlu mengirimkan argumen dalam bentuk keyword (bukan posisi), Anda bisa menggunakan objek ini. Tapi untuk kasus umum, `args` sudah cukup powerful.
`context`: Ini juga penting. Biasanya Anda akan mengirimkan `this.context` yang berisi konteks Odoo saat ini (user, lang, timezone, dll.). Anda juga bisa menambahkan kunci kustom di dalamnya jika dibutuhkan.

Misalnya, jika Anda punya nilai dari tiga field di UI (misal `nilaiFieldA`, `nilaiFieldB`, `nilaiFieldC`), Anda bisa mengirimkannya seperti ini:

```javascript
var self = this; // Untuk referensi scope di dalam .then() atau .catch()

var nilaiFieldA = this.$el.find('input[name="nama_field_a"]').val(); // Contoh ambil dari input
var nilaiFieldB = this.state.data.nama_field_b; // Contoh ambil dari record state (jika di form view)
var nilaiFieldC = 'Ini nilai hardcode atau dari variabel lain';

this._rpc({
model: 'nama.model.custom.anda', // Ganti dengan nama model Python Anda
method: 'nama_method_python_anda', // Ganti dengan nama method Python Anda
args: [nilaiFieldA, nilaiFieldB, nilaiFieldC], // Nah, ini array argumennya!
kwargs: {}, // Kosongkan atau isi jika ada keyword argumen
context: this.context, // Kirim konteks Odoo saat ini
})
.then(function (result) {
// Di sini Anda bisa memproses 'result' yang dikirim kembali dari Python
console.log("Method Python berhasil dipanggil, hasilnya:", result);
// Mungkin kasih notifikasi sukses ke user
self.do_notify("Sukses!", "Operasi berhasil diselesaikan.");
})
.catch(function (error) {
// Tangani error yang terjadi di sisi Python
console.error("Terjadi error saat memanggil method Python:", error);
self.do_warn("Error!", "Gagal melakukan operasi: " + (error.message.data.message || error.message));
});
```

---

Kedua, di sisi Python Anda (di file `models`):

Method Python Anda harus didefinisikan untuk menerima argumen-argumen tersebut sesuai urutan yang Anda kirimkan dari JavaScript.

```python
from odoo import models, fields, api

class NamaModelCustomAnda(models.Model):
_name = 'nama.model.custom.anda'
_description = 'Deskripsi Model Kustom Anda'

# ... field-field model Anda ...

@api.model # Ini penting agar method bisa dipanggil dari JS tanpa record tertentu
def nama_method_python_anda(self, argumen_satu, argumen_dua, argumen_tiga):
# 'self' adalah instance model.
# 'argumen_satu' akan berisi nilaiFieldA dari JS
# 'argumen_dua' akan berisi nilaiFieldB dari JS
# 'argumen_tiga' akan berisi nilaiFieldC dari JS

_logger.info(f"Menerima argumen dari JS: {argumen_satu}, {argumen_dua}, {argumen_tiga}")

# Lakukan logika bisnis Anda di sini dengan menggunakan argumen-argumen tersebut
# Contoh: Buat atau update record, lakukan kalkulasi, dll.

# Anda juga bisa mengakses self.env.user, self.env.cr, self.env.context, dll.
# Jika Anda ingin method ini berlaku untuk record tertentu, @api.model bisa diganti
# dengan @api.multi atau @api.depends tergantung kebutuhan dan Odoo version Anda.
# Untuk kasus 'custom button', @api.model paling sering digunakan jika tidak
# berinteraksi langsung dengan record yang sedang dibuka.

# Method ini harus mengembalikan sesuatu (bisa berupa dictionary, string, boolean, dll.)
# yang nantinya akan diterima oleh callback .then() di JavaScript.
return "Data berhasil diproses di server!"
```

---

Beberapa tips dan praktik terbaik:

1. Penanganan Error: Selalu gunakan blok `.catch()` di JavaScript untuk menangani error yang mungkin terjadi di sisi Python. Ini akan membuat UI Anda lebih robust.
2. Feedback UI: Berikan feedback kepada pengguna setelah operasi selesai (berhasil atau gagal). `self.do_notify()` atau `self.do_warn()` adalah fungsi utilitas yang sangat berguna di Odoo untuk ini.
3. `@api.model` vs `@api.multi`:
Gunakan `@api.model` jika method Anda tidak memerlukan instance record tertentu untuk beroperasi (misalnya, membuat record baru, melakukan query global, atau memproses data yang sepenuhnya dikirim dari JS). Argumen `self` akan berupa singleton (kumpulan kosong).
Gunakan `@api.multi` jika method Anda perlu beroperasi pada satu atau lebih record yang dipilih di UI. Dalam kasus ini, `self` akan menjadi recordset yang berisi record-record tersebut, dan argumen yang Anda kirim dari JS akan ditambahkan setelah `self`. Namun, untuk kasus Anda yang mengirim argumen dari UI secara langsung, `@api.model` lebih sering digunakan.

Dengan mengikuti pola ini, Mba Siska akan bisa mengirimkan argumen apa pun (bahkan objek kompleks, yang akan otomatis di-serialize menjadi JSON oleh Odoo) dari JavaScript ke method Python Anda dengan mudah dan sesuai praktik terbaik Odoo 11.

Semoga pencerahan ini membantu project Mba Siska berjalan lancar, ya! Kalau ada pertanyaan lanjutan, jangan sungkan untuk bertanya lagi. Semangat!

Berikan Tanggapan

⚠️ Anti-Spam Aktif: Dilarang menyertakan tautan/URL di dalam form ini.
Butuh Konsultasi Odoo? 👋
Scroll to Top