目录
添加字段
给字段设置只读和不可拷贝
给字段添加默认值
保留字段
本节目标:在本文末尾,售价(selling price)应为只读值,卧室数量(bedrooms)和可用日期(availability date)应为默认值。此外,在复制记录时,售价和可用日期值不会被复制。
添加字段
字段 active 和 state 需要被添加到 estate.property 模型中。
我们现在的模型看起来是这样的,注意新添加的两个字段:
class EstateProperty(models.Model):_name = "estate_property"_description = "Estate Property"name = fields.Char(required=True)description = fields.Text()postcode = fields.Char()date_available = fields.Date()expected_price = fields.Float(required=True)selling_price = fields.Float()bedrooms = fields.Integer()living_area = fields.Integer()facades = fields.Integer() # 外墙garage = fields.Boolean()garden = fields.Boolean()garden_area = fields.Integer()garden_orientation = fields.Selection([("north", "North"),("south", "South"),("east", "East"),("west", "West"),])active = fields.Boolean(default=True)state = fields.Selection([("new", "New"),("offer_received", "Offer Received"),("offer_accepted", "Offer Accepted"),("sold", "Sold"),("canceled", "Canceled"),], default="new",copy=False)
到目前为止,我们只在房地产广告中使用了通用视图,但在大多数情况下,我们希望对视图进行微调。在 Odoo 中可以进行许多微调,但通常第一步是确保:
- 某些字段有默认值
- 某些字段为只读
- 复制记录时不会复制某些字段
在我们的房地产模块中,我们希望做到以下几点:
- 售价应为只读(稍后将自动填写)
- 复制记录时,不应复制供货日期和售价
- 默认卧室数量应为 2
- 默认可用日期应为 3 个月内
在进一步进行视图设计之前,让我们先回到模型定义。我们看到,一些属性(如 required=True)会影响数据库中的表模式。
给字段设置只读和不可拷贝
下面给我们的estate_property里面的selling_price设置只读,和不可拷贝
date_available = fields.Date(copy=False)
selling_price = fields.Float(readonly=True, copy=False)
重启容器,Upgrade你的模块,你将看到如下效果,现在selling price应该不可改了:
给字段添加默认值
任何字段都可以有默认值。在字段定义中,添加 default=X 选项,其中 X 可以是一个 Python 字面值(布尔、整数、浮点、字符串),也可以是一个获取模型并返回值的函数:
name = fields.Char(default="Unknown")
last_seen = fields.Datetime("Last Seen", default=fields.Datetime.now)
name 字段的默认值为 "未知",而 last_seen 字段的默认值为当前时间。
下面给我们的estate_property模型设置默认值。
- 默认卧室数量为 2
- 默认可用日期为 3 个月
模型代码如下:
from odoo import models, fields, api
from dateutil.relativedelta import relativedeltaclass EstateProperty(models.Model):_name = "estate_property"_description = "Estate Property"def _get_default_date_available(self):# 使用 fields.Date.today() 获取当前日期,并添加三个月return fields.Date.today() + relativedelta(months=+3)name = fields.Char(required=True, default="Unknown")description = fields.Text()postcode = fields.Char()date_available = fields.Date(copy=False, default=_get_default_date_available)expected_price = fields.Float(required=True)selling_price = fields.Float(readonly=True, copy=False)bedrooms = fields.Integer()living_area = fields.Integer()facades = fields.Integer() # 外墙garage = fields.Boolean()garden = fields.Boolean()garden_area = fields.Integer()garden_orientation = fields.Selection([("north", "North"),("south", "South"),("east", "East"),("west", "West"),])active = fields.Boolean(default=True)state = fields.Selection([("new", "New"),("offer_received", "Offer Received"),("offer_accepted", "Offer Accepted"),("sold", "Sold"),("canceled", "Canceled"),], default="new")
重启容器,并Upgrade你的模块,点击新建的时候可以看到名字默认为Unknown,日期自动变成了3个月后
保留字段
一些字段名称是为预定义行为保留的。当需要相关行为时,应在模型上定义它们。
我们已经在文章的开头将active和state字段添加到 estate.property 模型中,当把active设置成false是,默认的房屋列表中将不会显示active=false的房屋。
active 是保留字段,具有特定行为:当记录的 active=False 时,它将自动从任何搜索中移除。要显示创建的属性,需要专门搜索非活动记录。
有了默认视图,我们就可以与用户界面交互了!下一节我们将定义自己的视图。
继续加油!
"Education is the most powerful weapon which you can use to change the world." - Nelson Mandela