Odoo 12开发之后台视图 – 设计用户界面
一·菜单项
<menuitem id ="menu_library_checkout"
name ="Checkout"
action ="action_library_checkout"
parent ="library_app.menu_library" />
二·窗口操作(Window Actions)
<act_window id ="action_library_checkout"
name ="Checkouts"
res_model ="library.checkout"
view_mode ="tree,form,activity,calendar,graph,pivot" />
三·表单视图结构
业务文档视图
# 业务应用中记录的很多数据可以按纸质文档那样展示
# 视图的基本框架:包含 form , header , sheet 和 mail
# header 状态栏,
sheet主内容 ,
底部交流区 也称作chatter,需要继承mail.thread和mail.activity.mixin
<record id ="view_form_checkout" model ="ir.ui.view" >
<field name ="model" > library.checkout</field >
<field name ="arch" type ="xml" >
<form >
<header >
<field name ="state" widget ="statusbar" clickable ="True" />
</header >
<sheet >
...
</sheet >
<div class ="oe_chatter" >
<field name ="message_follower_ids" widget ="mail_followers" />
<field name ="activity_ids" widget ="mail_activity" />
<field name ="message_ids" widget ="mail_thread" />
</div >
</form >
</field >
</record >
头部header 通常用于文档所走过的生命周期或步骤,还包含相关的操作按钮。这些按钮是普通表单按钮,最重要的下一步可以高亮显示。
头部按钮
<header >
<field name ="state" invisible ="True" />
<button name ="button_done"
string ="Return Books"
attrs ="{'invisible':
[('state', 'in', ['new', 'done'])]}"
class ="oe_highlight" />
</header >
#state字段, 相同的效果可以通过states字段属性实现.虽然没有attrs属性灵活,states更为精简
<button name ="button_done"
type ="object"
string ="Returned"
states ="open,cancel"
class ="oe_highlight" />
阶段管道
# 是statusbar组件的stage_id字段的<field>元素
# 通常状态或者阶段字段是一个many-to-on字段,允许使用者点击,clickable属性变更状态.
# 也可将状态隐藏折叠,通常命名为fold ,然后statusbar组件使用options属性来将这一字段名提供给fold_field
<header >
<field name ="stage_id"
widget ="statusbar"
clickable ="True"
options ="{'fold_field': 'fold'}" />
</header >
状态代替阶段
需要使用statusbar_visible属性来替换fold_field选项
<field name ="state"
widget ="statusbar"
clickable ="True"
statusbar_visible ="draft,open,done" />
文档表单
左上角文档标题和副标题
右上角按钮区
其它文档头部字段
底部笔记区,将附加字段组织成选项卡或页面
标题和副标题
<field name ="member_image" widget ="image" class ="oe_avatar" />
<div class ="oe_title" >
<label for ="member_id" class ="oe_edit_only" />
<h1 > <field name ="member_id" /> </h1 >
<h3 >
<span class ="oe_read_only" > By </span >
<label for ="user_id" class ="oe_edit_only" />
<field name ="user_id" class ="oe_inline" />
</h3 >
</div >
</sheet >
表单内容分组
<group name ="group_top" >
<group name ="group_col1" >
<field name ="user_id" />
<field name ="checkout_date" />
</group >
<group name ="group_col2" >
<field name ="state" />
<field name ="closed_date" />
</group >
</group >
选项卡笔记本(Tabbed notebooks)
string:选项卡的标题(必填)
attrs:不可见属性与表达式映射的字典
accesskey:HTML访问密钥
<notebook >
<page string ="Borrowed Books" name ="page_lines" >
<field name ="line_ids" />
</page >
</notebook >
四·字段
name
string
help
placeholder
widget
options
class
nolabel=”True ”
invisible=”True ”
readonly=”True ”
required=”True ”
password=”True ”
filename
字段标签
<label for ="name" class ="oe_edit_only" />
字段组件
mail
url
html
handle
float_time
monetary
progressbar
percentage和percentpie
many2many_tags
many2many_checkboxes
selection对many-to-one
radio
priority
state_selection
pdf_viewer
关联字段
options="{'no_open': True, 'no_create': True}"
context可定义关联字记录默认值
domain 可限制可选记录
五·按钮
普通按钮
string
type
object
action
name
args在类型为 object 时用于向方法传递额外的参数,须是在形成方法调用参数的记录 ID 之后所添加的纯静态 JSON 参数。
context
confirm
icon
智能按钮
class =”oe_stat_button”
icon
type 和name
string
context
help
num_other_checkouts = fields.Integer(compute='_compute_num_other_checkouts' )
def _compute_num_other_checkouts (self ):
for rec in self:
domain = [('member_id' , '=' , rec.member_id.id ),
('state' , 'in' , ['open' ]),
('id' , '!=' , rec.id )]
rec.num_other_checkouts = self.search_count(domain)
<div name ="button_box" class ="oe_button_box" >
<button class ="oe_stat_button"
icon ="fa-tasks"
help ="Other checkouts pending return."
type ="action"
name ="%(action_other_checkouts_button)d"
context ="{'default_member_id': member_id}" >
<field string ="To Return"
name ="num_other_checkouts"
widget ="statinfo" />
</button >
</div >
六·动态视图元素
onchange 事件
动态属性
例子: 要让closed_date字段在new和open 状态时不可见
<field name="closed_date" attrs="{'invisible':[('state', 'in', ['new', 'open'])]}" />
invisible不只在字段种可用,任意元素种均可使用.如notebook页面和group元素.attrs属性可以设置两个属性值:readonly和required.
七·列表视图
# tree元素的相关属性
# default_order让我们可以覆盖模型中的默认排序,它的值和模型中定义的排序格式相同。
# create, delete和edit,如果设为 false(字母小写),会禁用列表视图中的相应操作。
# editable让记录在列表视图中可直接被编辑。可用值有 top 和 bottom,表示新记录添加的位置。
# 数值字段可显示为对应列的汇总值。为字段添加一个累加属性(sum, avg, min或max)会为其分配汇总值的标签文本
<record id ="view_tree_checkout" model ="ir.ui.view" >
<field name ="name" > Checkout Tree</field >
<field name ="model" > library.checkout</field >
<field name ="arch" type ="xml" >
<tree
decoration-muted ="state in ['done', 'cancel']"
decoration-bf ="state=='open'" >
<field name ="state" invisible ="True" />
<field name ="request_date" />
<field name ="member_id" />
<field name ="checkout_date" />
<field name ="stage_id" />
<field name ="num_books" sum ="# Books" />
</tree >
</field >
</record >
num_books = fields.Integer(compute='_compute_num_books' )
@api.depends('line_ids' )
def _compute_num_books (self ):
for book in self:
book.num_books = len (book.line_ids)
八·搜索视图
<record id ="view_filter_checkout" model ="ir.ui.view" >
<field name ="model" > library.checkout</field >
<field name ="arch" type ="xml" >
<search >
<field name ="member_id" />
<field name ="user_id" />
<filter name ="filter_not_done"
string ="To Return"
domain ="[('state','=','open')]" />
<filter name ="filter_my_checkouts"
string ="My Checkouts"
domain ="['user_id', '=', uid]" />
<filter name ="group_user"
string ="By Member"
context ="{'group_by': 'member_id'}" />
</search >
</field >
</record >
九·其它视图类型
activity
calendar
diagram
graph
pivot
dashboard
cohort
gantt
grid
活动视图
# 由mail模块提供. 用于可视化活动任务
<activity string ='Activities' />
日历视图
# 在日历种展示记录,按照不同的时间区间.
# 属性:
date_start 开始日期 必填
date_end 结束日期 选填
date_delay 天数字段,用于替代date_end
all_day 传入一个布尔字段名,标识全天活动
color 用于日历添加颜色
mode 日历视图默认显示模块,
<record id ="view_calendar_checkout" model ="ir.ui.view" >
<field name ="model" > library.checkout</field >
<field name ="arch" type ="xml" >
<calendar date_start ="request_date"
color ="user_id" >
<field name ="member_id" />
<field name ="stage_id" />
</calendar >
</field >
</record >
透视表视图
num_books = fields.Integer(compute='_compute_num_books' ,store=True )
# name像其它视图一样标识图标种的字段
# type是指如何使用字段,行分组(默认)、度量(measure)或列(仅针对透视表,用于列分组)
# interval用于日期字段,是对时间数据的分组间隔:按天、按周、按月、按季度或按年
<record id ="view_pivot_checkout" model ="ir.ui.view" >
<field name ="model" > library.checkout</field >
<field name ="arch" type ="xml" >
<pivot >
<field name ="stage_id" type ="col" />
<field name ="member_id" />
<field name ="request_date" interval ="week" />
<field name ="num_books" type ="measure" />
</pivot >
</field >
</record >
图表视图
# 图表视图将数据累加展示图表. 可以使柱状图,线状图和饼图
# type属性,值可为 bar(默认), pie或line
# type=”row”是默认值,设置累加值的条件
# type=”measure”用于作为实际累加值的度量字段
<record id ="view_graph_checkout" model ="ir.ui.view" >
<field name ="model" > library.checkout</field >
<field name ="arch" type ="xml" >
<graph type ="bar" >
<field name ="stage_id" />
<field name ="num_books" type ="measure" />
</graph >
</field >
</record >
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2019-06-11 Python基础知识(六)------小数据池,集合set,深浅拷贝
2019-06-11 Python基础知识(五)------字典 , 解包 , 枚举 ,嵌套
2019-06-11 Python基础知识(四) 列表 , 字典 , 元组. 切片