Day9 Let's ODOO: View(2) Structure

我们今天来介绍一份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"/>

https://ithelp.ithome.com.tw/upload/images/20210924/20130896Fx1Tp1Pw99.png
最初就会如图,依照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>

https://ithelp.ithome.com.tw/upload/images/20210924/20130896tgr0jq4kii.png

我们可以以<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>

https://ithelp.ithome.com.tw/upload/images/20210924/20130896J0KzaKHt9g.png

Field

field内也有很多参数可以设置,我们将生日设为readonly='1' 常用於透过API新增,并让使用者无法透过Odoo View去修改,并用attr去控制is_leadership栏位在学生不在学的时候不会出现,让画面更有逻辑和客制化。

attr: 设定field内参数,常来设置复数参数readonlyinvisible写法也会用到之前的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>

https://ithelp.ithome.com.tw/upload/images/20210924/20130896Nc05eniUw2.png

基本的介绍就到这边,其实View通常会回去看odoo source code里的设定在做延伸,之後我们会做一个继承延伸的应用,明天来介绍Odoo的search view。


<<:  电子书阅读器上的浏览器 [Day24] 翻译功能 (VI) 翻译结果与主画面同步卷动

>>:  [Day 09] 从 tensorflow.keras 开始的 VGG Net 生活 (第二季)

Day13 Naming Rule & Template & 建构管理

坦白说这个课题,很多菜鸟常常没注意,但老鸟起手势马上就会做这件事,建立范本Template。 我第一...

Day 17: Structural patterns - Proxy

目的 将实际执行的服务遮蔽,取而代之的,建立一个代理人负责对外窗口的身份,以及对内与该服务沟通。 说...

Day 13:为自己的 Hexo 部落格增加 Disqus 留言功能(使用 Next 布景主题)

Hexo 虽然是静态网页产生器,因此不会像 WordPress 那样本身就内建内容储存在资料库的文章...

资料储存 - SqlAlchemy

之前我们做的所有操作,都是在 Jupyter Notebook 进行,没有进行资料储存的动作,所以只...

D17 - 从TiDB将资料同步出去

TiDB可以同步MySQL的资料异动,那麽能不能反过来让其他DB同步随着TiDB异动呢。 答案是可以...