Szeto Consultants

Mohon Pencerahan: Langkah-langkah Bikin Custom QWeb Report di Odoo

Mohon Pencerahan: Langkah-langkah Bikin Custom QWeb Report di Odoo

Diposting pada 14 Jun 2026, 15:07
Ditanyakan oleh: Ridwan

Halo teman-teman praktisi Odoo sekalian,

Ridwan dari tim IT nih. Saat ini di kantor, kami lagi pakai Odoo dan ada kebutuhan untuk bikin laporan custom yang formatnya agak beda dari standar, terutama untuk dokumen internal seperti laporan progres proyek atau summary operasional bulanan.

Rencananya mau pakai QWeb report. Nah, jujur saya masih agak bingung nih dari mana harus mulai. Saya sudah coba ngoprek-ngoprek dokumentasi, tapi rasanya masih kurang "klik" untuk implementasi riilnya.

Mungkin ada rekan-rekan yang punya pengalaman bikin custom QWeb report dari nol? Bisa di-share dong best practice-nya seperti:
1. File apa saja yang perlu dibuat (XML untuk report action, XML untuk template, Python untuk datanya)?
2. Gimana struktur dasar XML template QWeb yang efektif?
3. Kalau mau passing data custom dari model Python ke template QWeb, gimana cara paling simpel dan rapihnya?
4. Ada tips and trick lain biar proses development-nya lebih smooth?

Terima kasih banyak sebelumnya atas pencerahannya!

Balasan (1)

Admin Odoo ForumAdmin & AI Support14 Jun 2026, 15:08
Halo Mas Ridwan! Wah, ini topik yang menarik dan sering banget ditanyakan di komunitas. Bikin custom QWeb report memang salah satu skill fundamental di Odoo, apalagi kalau kebutuhan laporan internal agak spesifik.

Jangan khawatir, Mas! Memang awal-awal kadang butuh waktu untuk "klik". Tapi kalau sudah paham alurnya, bikin report itu jadi lebih gampang. Yuk, mari kita bedah langkah-langkahnya secara sistematis.



Secara garis besar, untuk membuat custom QWeb report, Mas Ridwan perlu menyiapkan tiga komponen utama:

1. File Python (.py) untuk data model report: Ini tempat kita menyiapkan data yang akan ditampilkan.
2. File XML (.xml) untuk Report Action: Ini adalah definisi report di Odoo, yang akan mendaftarkan report kita dan menghubungkannya dengan model Python serta template QWeb.
3. File XML (.xml) untuk QWeb Template: Ini adalah kerangka desain laporan kita, menggunakan sintaks QWeb yang mirip HTML.



Mari kita bahas satu per satu secara lebih detail:

### 1. File Apa Saja yang Perlu Dibuat?

Anggaplah kita punya modul sendiri, misalnya `my_custom_module`.

a. File Python (misal: `models/report_my_custom.py`)
Di dalam folder `models/`, buat file Python baru.
File ini akan berisi kelas yang meng-extend `models.AbstractModel`. Kelas inilah yang akan menjadi "penyedia data" untuk report kita.
Jangan lupa daftarkan file ini di `__init__.py` di folder `models/` dan juga di `__init__.py` utama modul Anda.

b. File XML untuk Report Action (misal: `reports/report_actions.xml`)
Di dalam folder `reports/`, buat file XML baru.
File ini akan mendefinisikan report kita agar bisa diakses dari Odoo (biasanya dari tombol "Print" atau "Cetak").
Jangan lupa daftarkan file ini di `__manifest__.py` modul Anda, di bagian `data`.

c. File XML untuk QWeb Template (misal: `reports/report_my_custom_template.xml`)
Di dalam folder `reports/`, buat file XML lain.
File ini berisi desain dan layout report kita.
File ini juga perlu didaftarkan di `__manifest__.py` modul Anda, di bagian `data`.



### 2. Gimana Struktur Dasar XML Template QWeb yang Efektif?

Struktur dasar template QWeb sangat mirip dengan HTML. Yang membedakan adalah adanya atribut `t-` yang digunakan oleh Odoo untuk memproses data.

```xml








Laporan Progres Proyek




Tanggal Cetak:





Proyek:



Manajer Proyek:



Status:





Deskripsi:








Terima kasih atas perhatiannya.











```

Beberapa hal penting:
`t-call="web.external_layout"`: Ini untuk menggunakan header dan footer standar Odoo. Jika ingin layout yang benar-benar custom tanpa header/footer Odoo, gunakan `t-call="web.html_container"` dan Anda harus mendesain sendiri seluruh tampilan.
`t-foreach="docs" t-as="doc"`: Digunakan untuk looping data. `docs` adalah variabel yang kita kirim dari Python, dan setiap itemnya akan diakses sebagai `doc`.
`t-if="doc.description"`: Digunakan untuk kondisi.
`t-field="doc.name"`: Untuk menampilkan nilai field dari record Odoo. Ini otomatis menangani formatting (misalnya tanggal, mata uang).
`t-esc="variabel_anda"`: Untuk menampilkan nilai variabel biasa (non-field Odoo). Hati-hati dengan HTML escaping, gunakan `t-raw` jika Anda yakin datanya aman dari XSS.



### 3. Kalau Mau Passing Data Custom dari Model Python ke Template QWeb, Gimana Cara Paling Simpel dan Rapihnya?

Ini bagian krusialnya, Mas! Kita akan menggunakan metode `_get_report_values` di kelas Python report Anda.

Berikut contohnya:

```python
# models/report_my_custom.py
from odoo import models, api
from datetime import datetime

class ReportMyCustom(models.AbstractModel):
_name = 'report.my_custom_module.report_my_custom_document'
# Nama ini harus sama dengan 'name' di atribut report action XML

@api.model
def _get_report_values(self, docids, data=None):
# docids adalah list ID dari record yang dipilih untuk dicetak
# data bisa berisi data tambahan jika Anda mempassingnya dari action_report.

# Mengambil objek record berdasarkan docids
# Asumsi 'my.model' adalah model yang ingin Anda cetak laporannya
docs = self.env['my.model'].browse(docids)

# Contoh data custom tambahan
custom_header_text = "Laporan Khusus Tim IT"

# Anda bisa melakukan komputasi atau fetching data lain di sini
# Misalnya, mendapatkan total dari semua proyek
total_proyek = len(docs)

# Penting: Kembalikan sebuah dictionary. Keys dari dictionary ini
# akan menjadi variabel yang bisa Anda akses di template QWeb.
return {
'doc_ids': docids,
'doc_model': 'my.model', # Model asal dari report
'docs': docs, # Ini adalah recordset utama yang akan kita loop di QWeb
'datetime': datetime, # Contoh mempassing object datetime agar bisa digunakan di QWeb
'custom_header': custom_header_text, # Data custom
'total_proyek': total_proyek, # Data custom dari komputasi
# Anda bisa menambahkan variabel lain di sini
}

```

Di template QWeb Anda, Anda bisa mengakses variabel-variabel ini langsung:
`docs`: seperti contoh di atas `t-foreach="docs" t-as="doc"`.
`datetime`: `t-esc="datetime.now().strftime('%d-%m-%Y')"`.
`custom_header`: ``.
`total_proyek`: `Total Proyek: `.

Simpel kan? Kuncinya ada di dictionary yang di-return oleh `_get_report_values`.



### 4. Ada Tips and Trick Lain Biar Proses Development-nya Lebih Smooth?

Tentu saja, Mas Ridwan! Ini beberapa tips yang bisa bikin hidup lebih mudah:

a. Jadikan Report Standar Odoo sebagai Referensi: Jangan malu mencontek! Buka folder `addons/` di instalasi Odoo Anda, cari modul yang punya report mirip dengan yang Anda inginkan (misalnya `account`, `sale`, `purchase`). Lihat bagaimana struktur XML template dan Python model report-nya. Ini adalah best practice terbaik.

b. Mulai dari yang Sederhana: Jangan langsung target report yang kompleks dengan banyak tabel dan kondisi. Buat dulu report yang paling simpel (misal: hanya menampilkan nama dan ID). Setelah itu, baru tambahkan fitur lain sedikit demi sedikit.

c. Aktifkan Developer Mode: Ini wajib! Di Developer Mode, Anda bisa langsung mengakses definisi report dari Odoo (Settings -> Technical -> Reports -> Reports) dan melihat detailnya. Anda juga bisa melihat "View Metadata" saat di form view untuk tahu nama teknis field atau model.

d. Debugging di Python: Jika ada masalah dengan data yang dikirim, gunakan debugger (misalnya `pdb` atau `ipdb` di Python) atau cetak nilai variabel (`print(variabel)`) di terminal Odoo saat `_get_report_values` dipanggil.

e. Jangan Lupa Restart Odoo dan Update Modul: Setiap kali ada perubahan di file Python atau XML, Anda WAJIB restart service Odoo dan update modul Anda dari interface Odoo (Apps -> Update App List -> Cari modul Anda -> Upgrade). Kalau tidak, perubahan tidak akan terlihat.

f. CSS untuk Styling: Untuk mengatur tampilan (font, warna, layout), Anda bisa menggunakan CSS. Masukkan tag `` di dalam template QWeb Anda, atau buat file CSS terpisah dan link-kan di template Anda (tapi ini agak lebih advance).

g. Manfaatkan Browser Inspect Element: Kadang errornya ada di rendering HTML. Setelah report dibuat dan di-preview (biasanya di browser), Anda bisa pakai "Inspect Element" di browser untuk melihat struktur HTML hasil render dan mencari tahu di mana letak masalahnya.

h. Error Message QWeb: Pelajari cara membaca error message dari QWeb. Biasanya akan memberitahu baris mana di template Anda yang bermasalah.



Semoga pencerahan ini membantu Mas Ridwan untuk memulai petualangan bikin custom QWeb report di Odoo! Kalau ada bagian yang masih kurang jelas atau ada kendala saat implementasi, jangan sungkan bertanya lagi ya. Komunitas Odoo Indonesia siap membantu! Semangat ngopreknya!

Berikan Tanggapan

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