Ở bài 194, model Python đã cho ta một màn hình nhập liệu — nhưng đó là giao diện tự sinh, thô: chỉ đúng các trường xếp dọc. Muốn danh sách gọn gàng và biểu mẫu bố cục đẹp, ta tự định nghĩa view bằng XML. Đây là nơi tách bạch của Odoo phát huy: model lo dữ liệu, view lo cách hiển thị — cùng một model có thể có nhiều kiểu nhìn.

Hai kiểu view cơ bản: list và form

Trong file views/the_thanh_vien_views.xml, ta khai hai view cho model thẻ thành viên:

Mã nguồn XML file the_thanh_vien_views.xml: một record view_the_list model ir.ui.view chứa thẻ list với ba field name partner_id diem; và một record view_the_form chứa thẻ form với sheet group và ba field tương tự

Hình 1: Hai view khai bằng XML. Mỗi view là một bản ghi ir.ui.view với ba khoá: name (tên gợi nhớ), model (áp cho model nào — quan.the.thanh.vien), và arch (kiến trúc giao diện). Bên trong arch: thẻ <list> định nghĩa danh sách (mỗi <field> là một cột); thẻ <form> định nghĩa biểu mẫu (dùng <sheet> và <group> để bố cục các ô).

Điểm mấu chốt: bạn không vẽ pixel, chỉ khai cần hiện field nào ở đâu. Odoo tự dựng bảng, ô nhập, nút bấm, tìm kiếm quanh đó.

Lưu ý Odoo 19: thẻ danh sách nay là <list> (các phiên bản cũ dùng <tree>). Nhãn cột tự lấy từ nhãn field đã khai ở model ("Mã thẻ", "Khách hàng", "Điểm tích luỹ").

Cài vào Odoo — danh sách hiện đúng như khai

Sau khi cập nhật module (-u quan_ca_phe), mở model lên, danh sách giờ đủ cột như ta định nghĩa:

Danh sách Thẻ thành viên trong Odoo với ba cột Mã thẻ, Khách hàng, Điểm tích luỹ; một dòng VIP-0001 của Nguyễn Văn An với 120 điểm

Hình 2: List view thật trong Odoo. Ba cột Mã thẻ / Khách hàng / Điểm tích luỹ — đúng ba <field> ta khai trong <list>. Bản ghi VIP-0001 của Nguyễn Văn An, 120 điểm. Bấm vào một dòng sẽ mở form view (biểu mẫu) đã khai để xem/sửa chi tiết. Cùng một model, hai cách nhìn — do XML quyết định.

So với giao diện tự sinh ở bài trước, giờ danh sách gọn, đủ thông tin cần thấy — mà chỉ tốn vài dòng XML.

Vì sao tách model và view?

Đây là triết lý cốt lõi của Odoo:

  • Một model, nhiều view: cùng dữ liệu thẻ thành viên, bạn có thể làm list (xem nhanh), form (nhập chi tiết), kanban (thẻ trực quan), pivot/graph (báo cáo) — mỗi cái một view.
  • Đổi giao diện không đụng dữ liệu: sửa cách hiển thị (thêm cột, đổi bố cục) chỉ chạm XML, bảng dữ liệu nguyên vẹn.
  • View kế thừa: người khác có thể "phủ" thêm lên view của bạn mà không sửa gốc (chủ đề của bài sau).

Chính vì thế Studio (bài 183) hay sửa view bằng Developer mode (bài 185) đều xoay quanh chính những ir.ui.view này — giờ bạn hiểu chúng từ gốc.

Lưu ý khi viết view

  • Field trong view phải tồn tại trong model — gõ sai tên field là view lỗi, form không mở.
  • Cập nhật module sau khi sửa XML (-u), và nhớ làm mới/khởi động lại để Odoo nạp view mới (cache).
  • Bố cục form dùng <sheet>, <group>, <notebook><page> — theo chuẩn để giao diện đồng nhất với phần còn lại của Odoo.
  • Đừng nhồi mọi field vào list — chỉ để cột cần nhìn nhanh; chi tiết để form.

Nhớ ba ý

  1. View XML quyết định cách hiển thị model: <list> (danh sách, mỗi field một cột) và <form> (biểu mẫu, dùng <sheet>/<group>).
  2. Mỗi view là một bản ghi ir.ui.view với name, model, arch — bạn khai field cần hiện, Odoo dựng giao diện quanh đó.
  3. Một model, nhiều view; đổi giao diện không đụng dữ liệu — đây là nền của Studio và tùy biến view đã học ở các bài trước.

Danh sách và biểu mẫu đã đẹp, nhưng người dùng vào bằng đường nào? Phần sau ta thêm menu và action để model có một mục menu riêng trong Odoo — bấm vào là mở đúng danh sách này.