Bài trước ta dùng domain để giới hạn chọn được gì. context là người anh em của nó, lo một việc khác: mặc định là gì khi tạo mới. Đặt đúng, người dùng bấm "Thêm một dòng" hay "Mới" trong một quan hệ là bản ghi con tự điền sẵn những giá trị bạn muốn — đỡ gõ, đỡ sai. Cơ chế nằm ở một quy ước đặt tên rất đơn giản: khoá default_<tên field>.

Quy tắc default_X

Trong context của một field quan hệ (hoặc của một action), mỗi khoá dạng default_X sẽ đặt giá trị mặc định cho field X của bản ghi được tạo mới trong quan hệ đó. Tôi gắn context này vào field lich_su_ids:

Ảnh chụp đoạn mã nền tối hai phần: phần một là field lich_su_ids trên One2many với context chứa ba khoá default_diem_cong bằng 10, default_ghi_chu bằng Điểm thưởng, default_ngay bằng hàm context_today; phần hai là method action_xem_lich_su của smart button trả về act_window với context chứa default_the_id bằng self.id; cuối ảnh ghi quy tắc khoá default_X đặt mặc định cho field X khi tạo mới, giá trị động dùng biểu thức, khác domain là lọc chọn được còn context là điền sẵn khi tạo

Hình 1: (1) Trên field lich_su_ids, ba khoá default_diem_cong, default_ghi_chu, default_ngay điền sẵn cho dòng mới. context_today() là hàm cho ra ngày hôm nay — giá trị động. (2) Trên method smart button, default_the_id khiến bản ghi tạo trong danh sách đó tự gắn về thẻ hiện tại. Khác domain (lọc chọn được), context điền sẵn khi tạo.

"Thêm một dòng" tự điền

Mở tab "Lịch sử điểm" của thẻ VIP-0001 rồi bấm "Thêm một dòng":

Ảnh chụp giao diện Odoo thật của tab Lịch sử điểm dạng bảng, ba dòng cũ Giới thiệu bạn 40, Mua 5 ly cà phê 50, Đổi combo Tết 30; dòng mới vừa thêm đang được chọn hiển thị Ngày 17 tháng 9, Điểm cộng 10, Ghi chú Điểm thưởng đều đã điền sẵn, dưới cùng là link Thêm một dòng

Hình 2: Dòng mới (đang chọn, dưới cùng) không trống — nó đã có sẵn: Ngày "17 thg 9" (hôm nay, từ context_today()), Điểm cộng "10", Ghi chú "Điểm thưởng". Cả ba đến thẳng từ các khoá default_* trong context của field. Người dùng chỉ việc sửa cái cần đổi rồi lưu.

Đây là khác biệt cốt lõi với domain: domain quyết định danh sách chọn được, còn context quyết định giá trị khởi đầu. Một cái là hàng rào, một cái là điểm xuất phát.

Giá trị tĩnh và động

default_diem_cong: 10 là giá trị tĩnh — luôn là 10. Nhưng default_ngay: context_today() là động — tính lại mỗi lần tạo, ra đúng ngày hôm đó. Vài biểu thức hay dùng trong context:

  • context_today() — ngày hôm nay.
  • active_id — id bản ghi đang mở (rất hay dùng để gắn quan hệ ngược).
  • Tham chiếu field khác của form hiện tại để điền theo ngữ cảnh.

Nhờ vậy context không chỉ nhét hằng số, mà điền được thứ phụ thuộc vào thời điểm và bản ghi.

context ở đâu, để làm gì

  • Trên field One2many/Many2many: mặc định cho dòng con khi bấm "Thêm một dòng". Ví dụ Hình 2.
  • Trên method/action trả act_window: mặc định cho bản ghi tạo khi bấm "Mới" trong danh sách mở ra. Đây là lý do smart button "Lượt tích điểm" khi bấm "Mới" đã tự gắn the_id — nhờ default_the_id (Hình 1, phần 2).
  • Kết hợp với domain: rất thường đi cặp — domain giới hạn chọn, context điền sẵn. Ví dụ mở danh sách khách của một công ty (domain) và đặt sẵn công ty đó cho bản ghi mới (context).

Một lưu ý: context chỉ tác động lúc tạo mới, không đụng tới bản ghi đã có. Và default_X chỉ là gợi ý ban đầu — người dùng sửa lại được, nó không phải ràng buộc.

Ba ý mang về

  1. Khoá default_<tên field> trong context đặt giá trị mặc định cho field đó khi tạo bản ghi mới trong quan hệ — bấm "Thêm một dòng"/"Mới" là điền sẵn.
  2. Giá trị tĩnh (hằng) hoặc động (context_today(), active_id, field khác) — context điền được cả thứ phụ thuộc thời điểm và ngữ cảnh.
  3. context (điền sẵn khi tạo) khác domain (lọc chọn được) và hay đi cặp; context chỉ tác động lúc tạo mới và người dùng vẫn sửa lại được.

Domain và context lo phần dữ liệu. Bài sau quay về phần con người nhìn thấy: Phần sau về label và help trên field — đặt nhãn cho rõ và thêm tooltip hướng dẫn để người dùng hiểu ô này để làm gì mà không cần hỏi.