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:

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":

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ắnthe_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 —
domaingiớ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ề
- Khoá
default_<tên field>trongcontextđặ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. - 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. context(điền sẵn khi tạo) khácdomain(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.