Bài học

Bài học thuộc : Odoo tip Trạng thái bài học : Chưa hoàn thành

Tạo bộ lọc động phụ thuộc vào giá trị một trường khác

Đôi khi trong quá trình viết code cho odoo bạn sẽ có nhu cầu tạo ra một bộ lọc (domain filter) động (dynamic) cho một trường nào đó. Trong bài viết nầy tôi sẽ giới thiệu cho các bạn một cách code khá đơn giản và tôi đã kiểm thử và nhận thấy chạy tốt trên odoo từ phiên bản 8.0 trở lên.

Bộ lọc động là gì (Dynamic domain filter)

Giả sử bạn sử dụng model hr.employee trong module HR tiêu chuẩn odoo phiên bản CE (ở đây tôi viết code mẫu trên odoo 10). Nhu cầu đặt ra là cần thiết kế một vài form view để chọn employee theo các usecase như sau:

  • Yêu cầu 1: Trên form view cho phép chọn employee theo danh sách sổ xuống, và danh sách employee được lọc theo giá trị của hộp chọn Phòng ban (department) là một trường có quan hệ M2O với model hr.department.
  • Yêu cầu 2: Trên form view cho phép chọn employee theo danh sách sổ xuống, và danh sách employee được lọc theo giá trị của hộp chọn danh mục phân loại là một trường có quan hệ M2M với model hr.employee

Có thể còn một vài kich bản khác nữa, nhưng tôi cho rằng để giải quyết vấn đề này bạn cần phải tạo ra và sử dụng được bộ lọc động cho field employee.

Cách thực hiện

Với yêu cầu 1, ta phải tạo ra một domain cho trường có quan hệ M2O với employee. Cách này khá đơn giản. Trước tiên cần mô tả model để tạo ra form view như sau:

Today you will learn how to create a dependent drop down (many2one) fields in Odoo. For example I have two many2one fields (campus_id and department_id), and we want to change the department on the basis of campus field.

campus_id = fields.Many2one(‘model.campus’, string=”Campus Name”)
department_id = fields.Many2one(‘model.department’, string=”Department Name”)

 @api.onchange(‘campus_id’)
2    def _campus_onchange(self):
3        res = {}
4        res[‘domain’]={‘department_id’:[(‘campus_id’, ‘=’, self.campus_id.id)]}
5        return res

Code Description:
In line no 1 we use @api.onchange decorator for campus_id. It means whenever campus changes or select a campus from many2one filed do the following line of code (3,4,5).  In line no 3 we declare a dict named res. In line no 4 we use domain to change the department field.

res[‘domain’]      =     {‘department_id’:[(‘campus_id’, ‘=’, self.campus_id.id)]}
                                       |                                |
                                       |                                |
   (field name which is to changed)       (field name which is intended to change)



Tags:


Gắn sao :  

Tác giả : admin admin

`
×