「Odoo 基礎教程系列」第四篇——從 Todo 應用開始(3)

Powered by @rawpixel

在這一篇教程中,將會涉及到外鍵字段,能夠將兩個模型關聯起來,而後很方便地獲取到對應的數據。python

關聯字段

這一小節裏,咱們會給待辦事項加上分類,而且這個分類可讓用戶本身建立維護。咱們須要先建立一個新的模型 TodoCategory,而後將它和待辦事項關聯起來:git

# models.py
class TodoCategory(models.Model):
    _name = 'todo.category'
    _description = '分類'

    name = fields.Char(u'名稱')
    task_ids = fields.One2many('todo.task', 'category_id', string=u'待辦事項')
    count = fields.Integer(u'任務數量', compute='_compute_task_count')

    @api.depends('task_ids')
    @api.multi
    def _compute_task_count(self):
        pass


class TodoTask(models.Model):
    _name = 'todo.task'
    _description = '待辦事項'
    # ...
    category_id = fields.Many2one('todo.category', string=u'分類')

在上面的代碼中,咱們定義了一個 todo.category 模型,包含三個字段,而後添加了一個 category_id 到待辦事項模型中,咱們重點來看看 category_idtask_ids 這兩個字段。github

這兩個字段都是關聯字段,一個是 Many2one,另外一個是 One2many,還有一種咱們暫時不會講到的 Many2many 多對多的關聯字段。Many2one 有一個必填的屬性 comodel_name 表示要關聯的模型的 _name,這個字段的值多是 0 個或 1 個所關聯對象的記錄集,咱們能夠經過這個字段直接獲取到所關聯的數據對象,而不須要本身去查找對應的實例。另外一個關聯字段 One2many 一樣有必填的屬性 comodel_name,同時還有一個 inverse_name 屬性,表示的是與當前模型所關聯的模型(comodel_name 所指的模型)的 Many2one 字段的字段名,在此例中即 category_id,經過 One2many 字段咱們能夠直接獲取到全部關聯了當前記錄的數據集。在這個例子中,假設咱們有一個分類是「工做」,也就是說咱們能夠經過工做這個分類的 task_ids 這個字段獲取到全部待辦事項中 category_id 所關聯的分類是「工做」的全部待辦事項。api

回到咱們的代碼中,咱們看到分類模型中還有一個計算字段 count,咱們但願能夠看到在一個分類下有多少待辦事項,因此須要用到上一篇教程中所講到的計算字段,這裏就看成是複習,一塊兒來完成這個字段的計算邏輯:ui

# models.py
@api.depends('task_ids')
@api.multi
def _compute_task_count(self):
    for record in self:
        record.count = len(record.task_ids)

這裏的邏輯也十分簡單,咱們只須要經過記錄集的實例對象 record 獲取到對應的待辦事項,而後用 len() 獲取 task_ids 的長度便可。spa

好的,模型已經有了,還差了點什麼呢?沒錯,還少了菜單和視圖,這裏咱們直接給出代碼,若是還有不理解怎麼建立菜單和視圖的小夥伴,記得翻看一下以前的教程內容。code

<!-- menus.xml -->
<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <!-- 主菜單定義 -->
        <menuitem id="menu_todo" name="Todo"/>
        <menuitem id="menu_todo_submenu" parent="menu_todo" name="待辦事項"/>
        <!-- 菜單動做定義 -->
        <record id="action_todo_task" model="ir.actions.act_window">
            <field name="name">待辦事項</field>
            <field name="res_model">todo.task</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form</field>
            <field name="target">current</field>
        </record>
    
        <record id="action_todo_category" model="ir.actions.act_window">
            <field name="name">分類</field>
            <field name="res_model">todo.category</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form</field>
            <field name="target">current</field>
        </record>
        <!-- 子菜單定義 -->
        <menuitem action="action_todo_category" id="submenu_todo_category" name="分類" parent="menu_todo_submenu" sequence="8"/>
        <menuitem action="action_todo_task" id="submenu_todo_task" name="待辦事項" parent="menu_todo_submenu" sequence="10"/>
    </data>
</odoo>

菜單這裏咱們多增長了一層,聰明的大家應該可以一眼看出來哪裏不一樣了,若是仍是沒找到,實際運行以後再觀察一下菜單的結構吧~orm

<!-- views.xml -->
<odoo>
    <data>
        <!-- ... -->
        <record id="todo_category_view_tree" model="ir.ui.view">
            <field name="name">todo.category.view_tree</field>
            <field name="model">todo.category</field>
            <field name="type">tree</field>
            <field name="arch" type="xml">
                <tree string="Todo Category">
                    <field name="name"/>
                    <field name="count"/>
                </tree>
            </field>
        </record>
    </data>
</odoo>

OK,來更新一下模塊,而後打開看看效果吧,再嘗試建立幾個分類,而且給待辦事項關聯上分類。xml

視圖

一切看起來還不錯,可是有沒有以爲,建立待辦事項的表單視圖(Form View),以及分類的表單視圖,顯得有些凌亂了?雖然並非不能用,可是,咱們仍是決定要改造一下!對象

咱們先從分類的視圖開始,首先能夠看到分類中主要的信息就兩個——分類的名稱和分類下的任務數量。待辦事項咱們其實不須要從分類中直接去查看,因此咱們大可沒必要把待辦事項的記錄顯示出來,那咱們的目標已經很明確了,隱藏分類表單視圖中的待辦事項記錄,和 Tree View 同樣,咱們把視圖先寫好:

<!-- views.xml -->
<record id="todo_category_view_form" model="ir.ui.view">
    <field name="name">todo.category.view_form</field>
    <field name="model">todo.category</field>
    <field name="type">form</field>
    <field name="arch" type="xml">
        <form string="Todo Category">
            <sheet>
                <group>
                    <group>
                        <field name="name"/>
                    </group>
                    <group>
                        <field name="count" readonly="True"/>
                    </group>
                </group>
            </sheet>
        </form>
    </field>
</record>

分類表單視圖

怎麼樣,看起來是否是舒服多了~再仔細一想,建立分類其實也只須要填一個名稱,能不能不須要跳轉到專門的表單視圖裏去建立咧?那固然是沒問題的啦,咱們可讓分類直接就在 Tree View 中建立而不須要專門到 Form View 中去:

<!-- views.xml -->
<record id="todo_category_view_tree" model="ir.ui.view">
    <field name="name">todo.category.view_tree</field>
    <field name="model">todo.category</field>
    <field name="type">tree</field>
    <field name="arch" type="xml">
        <tree string="Todo Category" editable="bottom">
            <field name="name"/>
            <field name="count"/>
        </tree>
    </field>
</record>

分類列表視圖

其實很簡單,咱們只須要在分類的 Tree View 中的 <tree /> 標籤中加上 editable="bottom" 這個屬性便可,超簡單有沒有!分類的視圖的處理,咱們就先到這裏,再來看看待辦事項的表單視圖應該怎麼弄比較好。

待辦事項的表單視圖,咱們只須要簡單地排一下版就好啦,沒有複雜的處理:

<!-- views.xml -->
<record id="todo_task_view_form" model="ir.ui.view">
    <field name="name">todo.task.view_form</field>
    <field name="model">todo.task</field>
    <field name="type">form</field>
    <field name="arch" type="xml">
        <form string="Todo">
            <sheet>
                <group>
                    <group>
                        <field name="name"/>
                        <field name="category_id"/>
                        <field name="is_done"/>
                    </group>
                    <group>
                        <field name="priority"/>
                        <field name="deadline"/>
                        <field name="is_expired" readonly="True"/>
                    </group>
                </group>
            </sheet>
        </form>
    </field>
</record>

待辦事項表單視圖

視圖部分,就先到這裏,這還只是很基礎的一小部份內容,後面還會有更多關於視圖部分的特性,在咱們用到的時候將會給你們講解。

今天這篇教程的內容就先到這裏了,教程中的代碼會更新在個人 GitHub 倉庫中。

倉庫地址:Odoo-Tutorial-Demo

相關文章
相關標籤/搜索