Szeto Consultants

Butuh Pencerahan: Tampilkan Field Many2many Jadi String HTML di Odoo

Butuh Pencerahan: Tampilkan Field Many2many Jadi String HTML di Odoo

Diposting pada 04 Jun 2026, 05:30
Ditanyakan oleh: Hendri

Halo rekan-rekan praktisi Odoo di grup ini! Salam kenal, saya Hendri, staf IT di sebuah perusahaan di Indonesia yang kebetulan sedang pakai Odoo ERP.

Saya lagi ada kendala nih terkait bagaimana cara terbaik untuk menampilkan data dari field Many2many agar bisa di-render sebagai string HTML. Misalnya, saya punya field m2m 'Daftar Produk Terkait' di modul penjualan, dan saya ingin output-nya di suatu laporan atau email template itu langsung dalam bentuk HTML yang rapi (misalnya nama-nama produk dipisahkan koma, atau pakai list ``).

Biasanya kan kalau kita panggil langsung field m2m, output-nya object/recordset, nah saya pengen nilai-nilai dari object tersebut (misal `name` atau `display_name`) itu bisa diolah jadi satu string HTML yang bisa langsung ditampilkan. Kira-kira ada tips atau pendekatan yang biasa teman-teman pakai untuk skenario seperti ini di Odoo? Apakah perlu computed field, custom method di model, atau ada trik di QWeb templating langsung untuk memformat output Many2many menjadi HTML? Mohon pencerahannya ya biar output di front-end atau di report jadi lebih informatif. Terima kasih banyak!

Balasan (1)

Admin Odoo ForumAdmin & AI Support04 Jun 2026, 05:30
Halo Mas Hendri! Salam kenal juga dan selamat bergabung di komunitas Odoo Indonesia! Wah, pertanyaan yang menarik nih dan sering banget muncul di kalangan praktisi Odoo yang ingin laporan atau emailnya makin informatif.

Betul sekali, secara default kalau kita panggil field Many2many (m2m) di Odoo, outputnya memang berupa object/recordset. Untuk mengubahnya jadi string HTML yang rapi, ada beberapa pendekatan yang bisa kita pakai. Yuk, kita bedah satu per satu!




### Pendekatan 1: Menggunakan Computed Field di Model (Disarankan!)

Ini adalah metode yang paling robust dan direkomendasikan terutama jika output HTML ini akan dipakai di lebih dari satu tempat (misalnya, di laporan QWeb, di email template, atau bahkan di form view Odoo itu sendiri).




Cara Kerjanya:
Anda akan membuat field baru di model Odoo Anda (misalnya di `sale.order` jika field m2m 'Daftar Produk Terkait' ada di sana). Field baru ini bertipe `fields.Html` dan nilainya dihitung (computed) berdasarkan data dari field Many2many yang Anda miliki.




Langkah-langkahnya (dalam Kode Python):

1. Buat Modul Kustom: Jika belum ada, buat modul kustom Anda.
2. Inherit Model: Di dalam modul kustom Anda, lakukan inherit model yang memiliki field m2m tersebut. Contoh untuk `sale.order`:
```python
from odoo import models, fields, api

class SaleOrder(models.Model):
_inherit = 'sale.order'

# Asumsi nama field Many2many Anda adalah 'x_related_product_ids'
# dan merujuk ke 'product.product'
# Sesuaikan dengan nama field m2m dan model target Anda
x_related_products_html = fields.Html(
string="Daftar Produk Terkait (HTML)",
compute='_compute_related_products_html',
# Jika performa adalah concern dan data tidak sering berubah,
# Anda bisa menambahkan store=True, tapi pastikan juga
# untuk menambahkan inverse method jika ingin field ini bisa diedit.
# Untuk kebanyakan kasus, store=False sudah cukup.
store=False
)

@api.depends('x_related_product_ids') # Pastikan method tergantung pada field Many2many Anda
def _compute_related_products_html(self):
for record in self:
html_output = ""
if record.x_related_product_ids:
# Opsi 1: Menampilkan sebagai daftar terpisah koma
# product_names = record.x_related_product_ids.mapped('display_name')
# html_output = ", ".join(product_names)

# Opsi 2: Menampilkan sebagai Unordered List (UL) - lebih rapi untuk HTML
html_output = "
    "
    for product in record.x_related_product_ids:
    html_output += f"
  • {product.display_name}
  • "
    html_output += "
"

record.x_related_products_html = html_output
```




Bagaimana Memanggilnya di QWeb Report atau Email Template:
Setelah computed field ini dibuat, Anda bisa memanggilnya di template QWeb Anda dengan sangat mudah, cukup gunakan `t-field` atau `t-raw`:
```xml

Produk Terkait:




<!-- -->
```

Catatan: Menggunakan `t-field` untuk `fields.Html` akan secara otomatis merender string HTML tersebut. `t-raw` juga bisa digunakan untuk output HTML, namun `t-field` lebih disarankan karena Odoo bisa menerapkan properti display dari field tersebut.






Keuntungan Pendekatan ini:
Reusability: String HTML sudah "siap pakai" dan bisa dipanggil di mana saja (QWeb, email, bahkan form view).
Kode Lebih Bersih: Logika pembentukan HTML terpusat di Python, membuat template QWeb Anda lebih rapi dan fokus pada presentasi.
Performa: Jika Anda menggunakan `store=True`, nilai HTML akan disimpan di database sehingga tidak perlu dihitung ulang setiap kali dipanggil (meskipun harus ada mekanisme recompute jika data m2m berubah).




### Pendekatan 2: Langsung Memproses di QWeb Templating

Jika kebutuhan ini hanya untuk satu laporan atau email template spesifik dan Anda tidak ingin menambah field baru di model, Anda bisa memproses langsung di QWeb.




Cara Kerjanya:
Anda akan menggunakan direktif `t-foreach` atau `t-set` di QWeb untuk mengulang atau memanipulasi recordset Many2many langsung di dalam template.




Contoh Implementasi (dalam Kode QWeb XML):

1. Untuk Daftar Terpisah Koma:
```xml

Daftar Produk Terkait:



```
Di sini, kita menggunakan `t-set` untuk membuat variabel `product_names` yang berisi string nama-nama produk yang digabungkan dengan koma, kemudian `t-raw` untuk merendernya.




2. Untuk Unordered List (`
  • ...
`):
```xml

Daftar Produk Terkait:







```
Dengan `t-foreach`, kita mengulang setiap produk di field Many2many (`doc.x_related_product_ids`), lalu untuk setiap `product`, kita tampilkan `display_name`-nya di dalam tag `
  • `.




    Keuntungan Pendekatan ini:
    Fleksibel: Tidak perlu mengubah kode Python di model.
    Cepat untuk Kasus Sederhana: Jika hanya satu atau dua laporan yang butuh format ini, pendekatan ini lebih cepat diimplementasikan.




    ### Jadi, Mana yang Terbaik?

    Untuk skenario yang Mas Hendri sampaikan, yaitu "output-nya di suatu laporan atau email template itu langsung dalam bentuk HTML yang rapi", saya pribadi lebih merekomendasikan pendekatan Computed Field.




    Mengapa? Karena ia memberikan solusi yang lebih terstruktur dan reusable. Logika pembentukan HTML terisolasi di Python, sehingga template Anda akan terlihat lebih bersih dan mudah dibaca. Selain itu, jika nanti ada kebutuhan untuk menampilkan "Daftar Produk Terkait" dengan format HTML yang sama di tempat lain (misalnya, di website Odoo, di chatter, atau di view lain), Anda tinggal panggil saja computed field tersebut.




    Pilih yang mana pun, pastikan Anda menggunakan `t-raw` atau `t-field` untuk field bertipe `fields.Html` di QWeb agar HTML-nya terender dengan benar dan tidak di-escape menjadi plain text.




    Semoga pencerahan ini membantu Mas Hendri dalam menampilkan data field Many2many jadi string HTML yang informatif di laporan atau email template Odoo-nya! Selamat mencoba dan jangan sungkan bertanya lagi jika ada kendala. Sukses selalu!
  • Berikan Tanggapan

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