我们今天来介绍一份View的基本结构
以昨日的Form作为例子:
<odoo>
<record id="view_res_student_form" model="ir.ui.view">
<field name="name">res.student.form</field>
<field name="model">res.student</field>
<field name="arch" type="xml">
<form>
<field name="name"/>
<field name="nickname"/>
<field name="birthday"/>
<field name="math_score"/>
<field name="chinese_score"/>
<field name="avg_score"/>
<field name="gender"/>
<field name="school_id"/>
<field name="is_leadership"/>
<field name="is_active"/>
<field name="senior_id"/>
<field name="junior_ids"/>
<field name="teacher_ids" widget="many2many_tags"/>
</form>
</field>
</record>
</odoo>
以 <odoo><data></data></odoo>
包覆整份xml
<record>
: 定义一个View的标签
id
: Odoo官方文件推荐写法为 view,必须为唯一值,以便让其他record参照。
model
: 定义此record为Odoo内的View,值为 ir.ui.view
.
<field name="name">res.student.form</field>
:为单纯作为描述与帮助识别用。
<field name="model">res.student</field>
: View的关联model
<field name="arch" type="xml">
: 代表定义xml底下的view
<form></form>
: 代表此view的type,同其他范例可为<list></list>
、<kanban></kanba>
剩下的就是内部view的规划
<field name="name"/>
<field name="nickname"/>
<field name="birthday"/>
<field name="avg_score"/>
<field name="gender"/>
<field name="senior_id"/>
<field name="school_id"/>
<field name="is_leadership"/>
<field name="is_active"/>
最初就会如图,依照field逐条列出。
我们以<sheet>
标签将field集合成一张卡片
<form>
<sheet>
<field name="name"/>
<field name="nickname"/>
<field name="birthday"/>
<field name="math_score"/>
<field name="chinese_score"/>
<field name="avg_score"/>
<field name="gender"/>
<field name="school_id"/>
<field name="is_leadership"/>
<field name="is_active"/>
<field name="senior_id"/>
<field name="junior_ids"/>
<field name="teacher_ids" widget="many2many_tags"/>
</sheet>
</form>
我们可以以<group>
标签区隔需要的区块
<form>
<sheet>
<group>
<field name="name"/>
<field name="nickname"/>
<field name="birthday"/>
<field name="math_score"/>
<field name="chinese_score"/>
<field name="avg_score"/>
<field name="gender"/>
<field name="school_id"/>
</group>
<group>
<field name="is_leadership"/>
<field name="is_active"/>
<field name="senior_id"/>
<field name="junior_ids"/>
<field name="teacher_ids"/>
</group>
</sheet>
</form>
field内也有很多参数可以设置,我们将生日设为readonly='1'
常用於透过API新增,并让使用者无法透过Odoo View去修改,并用attr去控制is_leadership
栏位在学生不在学的时候不会出现,让画面更有逻辑和客制化。
attr
: 设定field内参数,常来设置复数参数readonly
、invisible
写法也会用到之前的domain来限制条件,基本上这两个参数也建议在view里面设定,避免在model里面写死。
widget
:对於不同的field type内,可以透过此栏内变更显示,如此栏位选择老师就会以tag的方式显示,否则就会像学弟妹会以form的形式出现。
<form>
<sheet>
<group>
<field name="name"/>
<field name="nickname"/>
<field name="birthday" readonly="1"/>
<field name="math_score"/>
<field name="chinese_score"/>
<field name="avg_score"/>
<field name="gender"/>
<field name="school_id"/>
</group>
<group>
<field name="is_leadership" attrs="{'invisible': [('is_active', '=', False)]}"/>
<field name="is_active"/>
<field name="senior_id"/>
<field name="junior_ids"/>
<field name="teacher_ids" widget="many2many_tags"/>
</group>
</sheet>
</form>
基本的介绍就到这边,其实View通常会回去看odoo source code里的设定在做延伸,之後我们会做一个继承延伸的应用,明天来介绍Odoo的search view。
<<: 电子书阅读器上的浏览器 [Day24] 翻译功能 (VI) 翻译结果与主画面同步卷动
>>: [Day 09] 从 tensorflow.keras 开始的 VGG Net 生活 (第二季)
坦白说这个课题,很多菜鸟常常没注意,但老鸟起手势马上就会做这件事,建立范本Template。 我第一...
目的 将实际执行的服务遮蔽,取而代之的,建立一个代理人负责对外窗口的身份,以及对内与该服务沟通。 说...
Hexo 虽然是静态网页产生器,因此不会像 WordPress 那样本身就内建内容储存在资料库的文章...
之前我们做的所有操作,都是在 Jupyter Notebook 进行,没有进行资料储存的动作,所以只...
TiDB可以同步MySQL的资料异动,那麽能不能反过来让其他DB同步随着TiDB异动呢。 答案是可以...