视图
1. from视图属性
group标签
-
默认情况下一个group定义两个列,并且每个最直接的子元素占用一个列,field类型的元素默认显示一个标签
-
可以通过设置string 属性来定义组的标题;在group之外,我们可以使用html基本元素来制定标题,如:div,span,H1,和H2等,并且可以添加style属性指定css样式。
-
col和colspan属性 col属性可以指定组中包含的列数,默认值是2,它也可以改为任何数字,双数的效果更好,因为每一个字段加起来都要两列
-
组内元素设置,包括元素,可以使用colspan属性设置所占列数,默认都是2列。
-
newline标签,只在group元素里才有用,代表开启新的行。在组内一行还没布满时,强制换行布局。
-
使用元素添加组内分割线;可以通过string属性来设置该区域的标题
分页显示notebook
定义一个tab块,每一个tab通过一个page子元素定义,每个page可以有以下属性:
- string (required) --tab标签的名称
- accesskey --html accesskey
- attrs --基于记录值的动态属性(可见、只读),例如:attrs="{'invisible': [(表达式)]}"
field
展示当前记录的某个字段,有以下属性:
1.name
(必选)字段名。
2.attrs
标签属性,只有两个:invisible和readonly,可以根据表达式值来决定该两个值,从而动态控制标签的显示/隐藏、只读/可修改。
有两种设置方式:
1. 通过attrs属性统一设置,可以使用表达式进行动态设置
attrs="{'invisible': [('state', '!=', 'draft'), ('state', '!=', 'disable')]}"
2. 直接通过属性名单独、明确设置
<field name="" invisible="1" readonly="1"/>
3. widget
每个字段根据其数据类型有一个默认的展示方式,widget属性可指定用一个别的方式来展示。
4. options
标签行为,用于指定widget字段配置的json对象。这与该字段使用什么widget来显示有关,
odoo原生的字段类型都有对应的默认widget来负责显示,widget中封装了一些行为。
可以查看具体widget定义的js文件,从 this.options.XX 字眼得到有哪些options。
我们也可以自定义widget、继承widget来增加选项。
选项只能通过options属性进行设置:
//通过options属性统一设置
options="{'no_create': 1, 'no_open': 1}"
5. class
设置当前元素的css样式,odoo内置了以下样式类名,也可以使用boostrap相关样式类名、自定义的css样式文件中的类名。
【注意:这些样式不仅仅可以用于filed标签,表单内任何元素都可以套用】
- oe_inline:防止换行,防止它自动将之后的字段换行,使后面的内容自动在同一行显示。
- oe_left, oe_right:相当于css的float浮动,向左浮动布局、向右浮动布局。
- oe_read_only, oe_edit_only:只在相应的模式下显示,read_only的意思是只有在非编辑状态下才显示,edit_only是只有在编辑状态下显示。
- oe_no_button:不为many2one字段显示导航按钮
- oe_avatar:当该字段为图片时,将它展示为头像(90*90的正方形)
- oe_highlight:按钮高亮显示
6. groups
指定用户组可以看到该字段。【可以为某些字段做隐私、数据隔离】
7. on_change
在字段值改变时调用对应方法,从8.0开始改用模型中的 odoo.api.onchange()。
8. domain
在编辑时,当以 下拉选择 的方式选取 关联字段 时,过滤数据。
9. context
用于关联字段,显示数据时提供上下文环境。
10. readonly
该字段可在读和编辑模式下展示,但是永远是不能编辑的。
11. required
设置字段为必填,当该值没有设置就保存时给出一个错误提示并阻止保存。
12. nolabel
不显示字段的标签,只有在该字段是group子元素时起效。
一般搭配<label for='字段名' style="样式">使用,为字段自定义显示的标签。
13. placeholder
字段值为空时展示的提示。(水印文字)
14. mode
对于one2many字段,用于展示其关联的记录的形式,有tree, form, kanban , graph,默认是tree。
15. help
当将鼠标放在字段或标签时显示的提示
16. filename
对于二进制的字段,相关字段给出文件名。
17. password
表示该字段是一个密码,不明文展示。
18. string
`string="显示名称"` 显示名称会替换点字段中的models中字段定义的
2. search视图属性
增加快捷搜索使用field标签
增加快捷筛选使用 filter标签,搭配domain属性
<filter string="已确诊" name="is_ill" domain="[('is_ill', '=', True)]"/>
<filter string="未确诊" name="is_ill" domain="[('is_ill', '=', False)]"/>
增加快捷分组使用filter标签,搭配context使用
可以使用元素添加组内分割线
字段
常规字段
简单字段是直接存储在模型表中的原子值,你在视图中,录入值是什么,数据表中就会存储什么。而关系字段则是通过使用外键链接(相同或不同模型)记录,你只能通过选择(相同或不同模型)的记录,在保存后,数据表中存放的是你选择记录对应的id。
像 Image、Char、Boolean、Date、Datetime、Text、Html、Float、Integer、Selection 都是简单字段。
像 Many2one、Many2many、One2many 属于关系字段。
1. Boolean类型字段定义
fields.Boolead()
2. Many2one字段类型使用
user_id = fields.Many2one(‘res.users’) 参数为目标模型名称
3. Text字段类型使用
note = fields.Text() 文本类型字段
4. 字段基本属性readonly,required,invisible,attrs
有些字段虽然不是同以类型,但他们有相同的属性。比如 string 这个字段属性,像string一样可以拿去修饰不同字段的属性,我们称为共同属性。在odoo中,常用的odoo共同属性有:
| 属性名 | 属性值类型 | 默认值 | 作用及说明 |
|---|---|---|---|
| string | unicode(字符串) |
字段名 |
在视图中显示的字段标签。 |
required |
bool |
False |
表示这个字段是否可以为空(必填) |
help |
unicode(字符串 |
|
在是同中,为用户提供帮助提示。 |
index |
bool |
False |
是否在对应数据库列上创建数据库索引。 |
还有个 invisible 隐藏
attrs根据条件动态设置字段属性:
attrs='{'invisible': [('is_ill', '=', True)], 'required': [('is_ill', '=', False)]}'
5. 字段默认值
default属性可以是固定的值,也可以是一个函数(根据需求以及字段类型)
gender = fields.Selection(
[("1", "男性"), ("2", "女性"), ("3", "其他")],
string="性别", default="1"
)
直接设置默认值:
default='value'
值为一个方法
default=_default_fields_value
def _default_fields_value(self)
return value
create_user_id = fields.Many2one(‘res.users’, string=’创建人’, default=lambda: self, self.env.uid)
7. 保留字段
在我们创建一个模型后,模型会映射成数据库中的表,而模型中的字段,会映射成表中的列。但是你知道吗,即使你没有在模型中创建以下几个字段,映射出的表中也会出现对应的列。这是odoo系统管理创建的,我们并不建议你在模型中再去创建他们,这几个字段是:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Integer | 表主键,莫模型中记录的唯一标识。 |
| create_date | Datetime | 记录的创建日期。 |
| create_uid | Many2one | 记录的创建者。 |
| write_date | Datetime | 记录的最后修改日期。 |
| write_uid | Many2one | 记录的最后修改者。 |
8. 特殊字段
在odoo中,有几个字段比较特殊:
| active | Boolean | 这个比较特殊,如果你创建了这个字段,又刚好为其增加了属性default=Fasle ,那么你创建的所有记录都将看不到,除非你将default=False 过滤出来。 |
| name | Unicode(字符串) |
为什么说这个字段,你最好在模型中创建它。是因为odoo要求且需要有这么一个字段,显示和显示各种行为。如果没有,也不会影响系统的运行,它只是会在你打开一条记录后,无法显示你当前的记录是什么。 |
下面是字段的具体使用方法
from odoo import api, fields, models, _
class ZeroneBook(models.Model):
_name = "zerone.book"
_description = "Zerone Books"
_inherit = ['image.mixin']
image_1920 = fields.Image(string="图书样例")
name = fields.Char(string="图书名称", required=True)
code = fields.Char(string="图书编号", copy=False, help="管理编号,用于快速定位图书")
isbn = fields.Char(string="ISBN", copy=False)
author = fields.Char(string="作者")
pages = fields.Integer(string="页数")
publish_date = fields.Date(string="出版时间")
publisher = fields.Char(string="出版社")
price = fields.Float(string="定价", digits=(7, 2))
description = fields.Text(string="内容简介", help="""向借阅者描述本书的内容""")
binding_type = fields.Selection(
[("common", "普通"), ("hardcover", "精装")],
string="装帧类型", index=True, default='common'
)
e_link = fields.Html(string="电子版连接")
borrowed = fields.Boolean(string="是否被借阅", default=False)
date_last_borrowed = fields.Datetime("最后被借阅时间", index=True, readonly=True)
shelf_id = fields.Many2one('zerone.shelf', string='所在书架')
tags_ids = fields.Many2many("zerone.tags", string="标签")
@api.depends('isbn', 'name')
def name_get(self):
result = []
for book in self:
result.append((book.id, '%s(%s)' % (book.name, book.isbn)))
return result
在简单字段中,Image 类型的字段这里特别说明一下,在使用该字段时,需要在当前模型中,继承image mixin ,用来处理图片的 显示,如果不继承image.mixin, 你将不能保存图片,更无法显示到视图。
Odoo one2many many2many 写值规则
odoo12以后one2many many2many 写值规则基本相同
# many2many
# 根据values里面的信息新建一个记录。
(0,0,{values})
# 更新id=ID的记录(写入values里面的数据)
(1,ID,{values})
# 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)
(2,ID)
# 切断主从数据的链接关系但是不删除这个数据
(3,ID)
# 为id=ID的数据添加主从链接关系。
(4,ID)
# 删除所有的从数据的链接关系就是向所有的从数据调用(3,ID)
(5)
# 用IDs里面的记录替换原来的记录(就是先执行(5)再执行循环IDs执行(4,ID))
(6,0,[IDs])