Dalam pengembangan aplikasi menggunakan Odoo, elemen <form>
adalah bagian integral dari antarmuka pengguna yang digunakan untuk mengelola data. Formulir pada Odoo dirancang untuk menampilkan, mengedit, dan memvalidasi data model. Artikel ini akan membahas anatomi form, contoh kode, dan cara melakukan kustomisasi.
Anatomi <form>
di Odoo
Odoo menggunakan XML untuk mendefinisikan tampilan form. Berikut adalah elemen utama dalam sebuah form Odoo:
1. Tag
- Tag utama yang mendefinisikan form.
- Wajib memiliki atribut
string
untuk memberikan nama pada form.
2. Field
- Menggunakan tag
<field>
untuk menampilkan data dari model. - Dapat memiliki atribut seperti
name
,widget
, danreadonly
.
3. Groups dan Pages
<group>
: Digunakan untuk mengelompokkan field dalam satu baris.<page>
: Digunakan untuk membuat tab dalam form.
4. Header
- Bagian atas form yang sering digunakan untuk kontrol tindakan, status, atau informasi ringkas.
5. Notebook
- Membagi form menjadi beberapa tab.
6. Footer
- Bagian bawah form untuk tombol action atau informasi tambahan.
Contoh struktur umum:
<record id="view_form_example" model="ir.ui.view">
<field name="name">example.form</field>
<field name="model">example.model</field>
<field name="arch" type="xml">
<form string="Example Form">
<header>
<button string="Approve" type="object" name="action_approve" class="btn-primary"/>
<field name="state" widget="statusbar" statusbar_visible="draft,approved"/>
</header>
<sheet>
<group>
<field name="name"/>
<field name="description"/>
</group>
<notebook>
<page string="Details">
<field name="details"/>
</page>
<page string="History">
<field name="history" widget="one2many_list"/>
</page>
</notebook>
</sheet>
<footer>
<button string="Cancel" class="btn-secondary" type="object" name="action_cancel"/>
</footer>
</form>
</field>
</record>
Contoh Kode Formulir Sederhana
Model (Python)
from odoo import models, fields
class ExampleModel(models.Model):
_name = 'example.model'
_description = 'Example Model'
name = fields.Char(string="Name", required=True)
description = fields.Text(string="Description")
details = fields.Text(string="Details")
history = fields.One2many('example.history', 'example_id', string="History")
state = fields.Selection([
('draft', 'Draft'),
('approved', 'Approved'),
], default='draft', string="Status")
Tampilan (XML)
<odoo>
<record id="example_form_view" model="ir.ui.view">
<field name="name">example.form.view</field>
<field name="model">example.model</field>
<field name="arch" type="xml">
<form string="Example Form">
<header>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<field name="name"/>
<field name="description"/>
</group>
</sheet>
</form>
</field>
</record>
</odoo>
Kustomisasi Form
- Menambahkan Widget Odoo menyediakan berbagai widget untuk memperkaya tampilan field. Contoh penggunaan:
<field name="date" widget="date"/>
<field name="state" widget="statusbar" statusbar_visible="draft,approved"/>
- Dinamika Field Menggunakan atribut seperti
attrs
untuk membuat field bersyarat:
<field name="description" attrs="{'readonly': [('state', '=', 'approved')]}"/>
- **Inheritance (Menggunakan **``) Untuk mengubah form yang sudah ada:
<odoo>
<record id="example_form_view" model="ir.ui.view">
<field name="inherit_id" ref="module_name.example_form_view"/>
<field name="arch" type="xml">
<xpath expr="//group" position="inside">
<field name="new_field"/>
</xpath>
</field>
</record>
</odoo>
- Menambahkan Aksi Kustom Tambahkan tombol action yang memanggil fungsi pada model:
<button string="Approve" type="object" name="action_approve"/>
Pada model:
def action_approve(self):
for record in self:
record.state = 'approved'