Trường tính toán và giá trị mặc định

Một phần của tài liệu Tìm hiểu ODOO FRAMEWORK và xây dựng ứng dụng thương mại điện tử WEBSITE EPIC furniture (báo cáo cuối kì đồ án 1) (Trang 167 - 169)

III. Xây dựng mô-đun – Building modules

6. Trường tính toán và giá trị mặc định

Cho đến nay các trường đã được lưu trữ trực tiếp và truy xuất trực tiếp từ cơ sở dữ liệu. Các trường cũng có thể được tính toán. Trong trường hợp đó, giá trị của trường không được lấy từ cơ sở dữ liệu mà được tính toán nhanh chóng bằng cách gọi một phương thức của mô hình.

Để tạo trường được tính toán, hãy tạo một trường và đặt compute thuộc tính của trường đó thành tên của một phương thức. Phương pháp tính toán chỉ cần đặt giá trị của trường để tính toán trên mọi bản ghi trong tự .

Nguy hiểm

self là một bộ sưu tập

Bản thân đối tượng là một tập hồ sơ, tức là một bộ sưu tập các bản ghi theo thứ tự. Nó hỗ

trợ các hoạt động Python tiêu chuẩn trên các bộ sưu tập, như len (self) và iter(self),cộng với các

hoạt động thiết lập thêm như recs1 + recs2.

Quay vòng trên bản thân cung cấp cho các bản ghi từng bản ghi một, trong đó mỗi bản ghi

chính nó là một bộ sưu tập kích thước 1. Bạn có thể truy cập/gán các trường trên một bản ghi bằng

cách sử dụng dấu chấm, chẳng hạn như record.name.

importrandom

fromodooimport models, fields, api classComputedModel(models.Model): _name = 'test.computed'

name = fields.Char(compute='_compute_name') def_compute_name(self):

for record in self:

record.name = str(random.randint(1, 1e6))

Phụ thuộc

Giá trị của trường được tính toán thường phụ thuộc vào giá trị của các trường khác trên bản ghi được tính toán. ORM hy vọng nhà phát triển sẽ chỉ định những phụ thuộc vào phương thức điện toán với bộ trang depends(). Các phụ thuộc nhất định được ORM sử dụng để kích hoạt tính toán lại trường bất cứ khi nào một số phụ thuộc của nó đã được sửa đổi:

classComputedModel(models.Model): _name = 'test.computed'

name = fields.Char(compute='_compute_name') value = fields.Integer()

@api.depends('value') def_compute_name(self): for record in self:

record.name = "Record with value %s" % record.value

Bài tập

Trường được tính toán

● Thêm tỷ lệ phần trăm số ghế đã lấy vào mô hình Phiên

● Hiển thị trường đó trong dạng xem dạng cây và biểu mẫu

● Hiển thị trường dưới dạng thanh tiến trình

Giá trị mặc định

Bất kỳ trường nào cũng có thể được cung cấp một giá trị mặc định. Trong định nghĩa trường, thêm tùy chọn default=X trong đó X là giá trị theo nghĩa đen Python (boolean, số nguyên, float, chuỗi) hoặc hàm lấy tập bản ghi và trả về giá trị:

name = fields.Char(default="Unknown")

user_id = fields.Many2one('res.users', default=lambdaself: self.env.user)

Ghi chú

Đối tượng self.env cho phép truy cập vào các tham số yêu cầu và những thứ hữu ích khác:

● self.env.cr hoặc self._cr đối tượngcon trỏ cơ sở dữ liệu; nó được sử dụng để truy vấn

cơ sở dữ liệu

● self.env.uid hoặcself._uidid cơ sở dữ liệu của người dùng hiện tại

● self.env.user là bản ghi của người dùng hiện tại

● self.env.context hoặc self._contextlà từ điển ngữ cảnh

● self.env.ref(xml_id) trả về bản ghi tương ứng với id XML

● self.env[model_name] trả về một thể hiện của mô hình đã cho

Bài tập

Đối tượng hiện hoạt – Giá trị mặc định

● Xác định giá start_date mặc định như hôm nay (xem Date).

● Thêm trường hoạt động trong Phiên lớp học và đặt phiên hoạt động theo mặc định.

Cơ chế "onchange" cung cấp một cách để giao diện máy khách cập nhật biểu mẫu bất cứ khi nào người dùng đã điền vào một giá trị trong một trường mà không lưu bất cứ thứ gì vào cơ sở dữ liệu.

Ví dụ: giả sử một mô hình có ba trường số tiền , unit price và giá và bạn muốn cập nhật giá trên biểu mẫu khi bất kỳ trường nào khác được sửa đổi. Để đạt được điều này, hãy xác định một phương thức trong đó tự đại diện cho bản ghi trong dạng xem biểu mẫu và trang trí nó bằng onchange() để chỉ định trường nào nó phải được kích hoạt. Bất kỳ thay đổi nào bạn thực hiện trên bản thân sẽ được phản ánh trên biểu mẫu.

<!-- content of form view -->

<fieldname="amount"/> <fieldname="unit_price"/>

<fieldname="price"readonly="1"/>

# onchange handler

@api.onchange('amount', 'unit_price') def_onchange_price(self):

# set auto-changing field

self.price = self.amount * self.unit_price # Can optionally return a warning and domains

return { 'warning': {

'title': "Something bad happened", 'message': "It was very bad indeed", }

}

Đối với các trường được tính toán, hành vi onchange có giá trị được tích hợp sẵn như có thể thấy bằng cách chơi với biểu mẫu Phiên: thay đổi số lượng chỗ ngồi hoặc người tham gia và thanh tiến trình taken_seats được tự động cập nhật.

Bài tập

Cảnh báo

Thêm một sự thay đổi rõ ràng để cảnh báo về các giá trị không hợp lệ, chẳng hạn như số ghế âm hoặc nhiều người tham gia hơn chỗ ngồi.

Một phần của tài liệu Tìm hiểu ODOO FRAMEWORK và xây dựng ứng dụng thương mại điện tử WEBSITE EPIC furniture (báo cáo cuối kì đồ án 1) (Trang 167 - 169)

Tải bản đầy đủ (PDF)

(183 trang)