Odoo开发基本字段属性和使用

2,344 阅读8分钟

视图

1. from视图属性

group标签

  1. 默认情况下一个group定义两个列,并且每个最直接的子元素占用一个列,field类型的元素默认显示一个标签

  2. 可以通过设置string 属性来定义组的标题;在group之外,我们可以使用html基本元素来制定标题,如:div,span,H1,和H2等,并且可以添加style属性指定css样式。

  3. col和colspan属性 col属性可以指定组中包含的列数,默认值是2,它也可以改为任何数字,双数的效果更好,因为每一个字段加起来都要两列

  4. 组内元素设置,包括元素,可以使用colspan属性设置所占列数,默认都是2列。

  5. newline标签,只在group元素里才有用,代表开启新的行。在组内一行还没布满时,强制换行布局。

  6. 使用元素添加组内分割线;可以通过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系统管理创建的,我们并不建议你在模型中再去创建他们,这几个字段是:

字段名类型说明
idInteger表主键,莫模型中记录的唯一标识。
create_dateDatetime记录的创建日期。

create_uid

Many2one记录的创建者。
write_dateDatetime记录的最后修改日期。

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])