国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

UCloud / 999人閱讀

摘要:雖然這是個很簡單的應用,但是希望大家可以動手一起操作,從最簡單的開始上手學習如何使用這個框架。則是在和之間,負責響應用戶操作,從中獲取數據進行處理并返回到中。

在第一篇教程發布之后差不多一個月的今天,終于完成了第二篇內容,這個發布周期拖得實在是有點太長了,我都覺得不好意思了?

從這一篇教程開始,我們將以創建一個 Todo 應用為目標,將 Odoo 中的一些概念和內容逐漸引入進來,然后利用這些知識去完善我們的 Todo 應用。雖然這是個很簡單的應用,但是希望大家可以動手一起操作,從最簡單的開始上手學習如何使用 Odoo 這個框架。

這篇教程將會帶領大家一起創建第一個 Odoo 模塊,為模型增加菜單和修改視圖,對于剛接觸的小伙伴來說可能會有些生澀,不理解也沒關系,慢慢接觸上手之后會顯得容易得多,同時也歡迎大家積極提問,我會竭盡所能去幫助愛學習的小伙伴的。

好了,下面就正式開始,一起動手完成這一次的內容吧?

創建模塊

我們在 Odoo 源碼所在目錄的同一層級里創建一個目錄 mkdir mymodules,這個目錄專門用于存放我們自己創建的模塊,和 Odoo 自帶的模塊區分開來,當然你也可以用其他名字。然后用 odoo-bin 的腳手架功能創建一個空的 Odoo 模塊,里面包含了一個完整的項目所需的基本文件和項目結構:

./odoo/odoo-bin scaffold todo mymodules

進去 mymodules/ 看看,是不是多了一個目錄 todo/?就是這么簡單,我們的第一個 Odoo 模塊就創建好了,接下來先對項目結構進行簡單的說明,了解一下各個目錄底下應該放置些什么內容。

結構說明

下面是我們剛創建的 todo 模塊的目錄結構,從上到下一一進行說明:

todo
├── __init__.py
├── __manifest__.py
├── controllers
│?? ├── __init__.py
│?? └── controllers.py
├── demo
│?? └── demo.xml
├── models
│?? ├── __init__.py
│?? └── models.py
├── security
│?? └── ir.model.access.csv
└── views
    ├── templates.xml
    └── views.xml

在 Python 中,每一個包(package)都包含一個 __init__.py 文件,而一個 Odoo 的模塊,同時也是一個 Python 包,所以我們可以看到,生成的項目文件里已經包含了 __init__.py 這個文件,如果打開這個文件,你會看到里面引入了 controllersmodels 這兩個包,稍候我們會講到這兩個,這里先放一放。那么對于這個 __init__.py 文件,我們沒什么特殊需求,是可以不用去理會的,就讓它靜靜地躺在那里完成它的使命就好了。

文件 __manifest__.py 用于聲明一個 Odoo 模塊以及指定它的元數據(metadata),文件里只包含了一個多帶帶的 Python 字典,里面默認只列出了 9 項最基本的配置項,包含了模塊(或應用)名,模塊的簡介和詳細介紹,作者和網站,模塊的所屬分類、版本,還有就是這個模塊依賴于其他的哪些 Odoo 模塊,需要加載哪些數據文件以及演示數據。除了這里列出的配置項外,還有一些高級配置項,我們這里暫時不需要理會,后面用到之后將會進行詳細的說明。

接下來我們先講一下 demosecurity 這兩個目錄。前者是用于存放演示數據的,在 __manifest__.py 中就可以看到有引入該目錄下的 demo.xml 文件,在使用演示模式時,初始化一些演示數據可以幫我們節省不少的時間;而后者通過名字就知道它的作用是跟安全相關的,目錄下只有一個 ir.model.access.csv 文件,里面用于定義不同的角色組對應于不同模型的相關權限,包括讀(read),寫(write),創建(create)和刪除(unlink)權限,擁有相關權限則為 1,反之為 0。我們剛提到了角色組,但是沒有發現相關定義的位置,我們只要默認角色組的定義和模型權限定義在同一目錄下就可以了,角色組的定義同樣也是使用的 .xml 文件,在后面我們會有專門的一篇文章對角色組和權限進行講解說明。

下面要講的是 Odoo 開發中的核心部分 MVC(同時也是大部分 Web 應用開發所采用的經典模式),MVC 分別代表的是 Model(模型)、View(視圖)和 Controller(控制器)。有關 MVC 模式具體的概念和相關的知識,這里就不作詳細講解了,希望不了解的同學可以去找找相關的內容學習一下。這里簡單說一下它們各自的用途,在 Model 中,我們定義一切和數據相關的東西,例如對應到數據庫表字段的模型字段、各種外鍵關系以及操作數據的邏輯方法等。View 則是負責數據展示的,我們通過編寫視圖控制需要展示出來的數據以及以什么樣的形式展示數據等,并且可以在視圖上進行交互。Controller 則是在 Model 和 View 之間,負責響應用戶操作,從 Model 中獲取數據進行處理并返回到 View 中。

以上就是對一個 Odoo 模塊的目錄結構的一些簡單的說明,另外還有一些目錄在初始創建的模塊里是沒有出現的,但是我們后面會用上,到時候自己手動創建相應的目錄即可。

模型

前面一節中我們說到 Model 是用于定義和數據相關內容的地方,現在就來創建第一個模型吧。

首先打開 models/models.py 將里面注釋掉的內容刪掉,不要修改文件頂部引入的包,然后添加以下代碼:

class TodoTask(models.Model):
     _name = "todo.task"
     _description = "待辦事項"

     name = fields.Char("描述", required=True)
     is_done = fields.Boolean("已完成?")

看起來十分簡單,第一個模型就這樣創建好了 :)

我們創建了一個叫做 TodoTask 的類,它繼承自基礎模型 models.Model,這也是我們使用 Odoo 開發時最常用的一種用于持久化數據的基礎模型,除此之外還有 models.TransientModelmodels.AbstractModel 這兩種,在之后接觸到我們將會進行講解,這里暫不涉獵。

先看一下這個模型里帶下劃線前綴的兩個屬性:

_name - 模型的名稱,在外鍵或者實例化模型對象時會用到,是模型的唯一標識

_description - 模型的描述,描述模型的作用,一般情況下不會主動使用到

除了上面列出的兩個特殊屬性外,還有一些其他屬性,例如更改默認顯示名稱時會用到 _rec_name,繼承現有模型時會用到 _inherit 等,這些特殊屬性都具有他們各自的用途,但是除了 _name 是定義一個新的模型時必須要有的屬性外,其他屬性都是可選的。

在 Odoo 的模型定義中,我們使用 fields 進行字段的定義,在上面這個模型里,我們簡單地定義了 nameis_done 兩個字段,它們的類型分別是 CharBoolean,并且我們指定字段 name 是必填的(添加了 required=True)。如果小伙伴接觸過 Django,可能就會說了,Django 的 CharField 是必須指定最大長度 max_length 的,Odoo 的不需要嗎?那最大長度是多少呢?對于這個疑問,官方的文檔里有這樣一句說明:

Basic string field, can be length-limited, usually displayed as a single-line string in clients.

也就是說 Odoo 的字段類型 Char 是不限制長度的,但是通常只是用于單行字符串,如果要存儲大量文本內容,還是使用 Text 更合適一些。

不如我們先把模塊安裝好,看看會不會有什么事情發生,和上一篇教程一樣,我們先將 Odoo 服務跑起來,記得先在 Odoo 的源碼目錄中激活我們的開發環境:

pipenv shell

./odoo-bin --addons-path=addons,../mymodules --db-filter=^demo$ -d demo

需要注意一下的是 --addons-path 中除了有 addons 外,還加上了我們剛創建的模塊目錄 mymodules,這里使用的是相對路徑,不要搞錯了哦 :)

接下來我們打開瀏覽器訪問 localhost:8069 然后用超級管理員帳號登錄(不記得了?帳號密碼都是 admin),登錄后在應用列表頁面,將搜索框的 Apps 標簽去掉,搜索關鍵詞 todo 找到我們剛創建的模塊,點擊 Install 按鈕安裝模塊。好了,你很快就會發現,頁面又倒回了應用列表頁面,如果我們再次按前面的步驟搜索我們的模塊,你會發現沒有了安裝按鈕,現在顯示的是 Installed 已安裝,除了這個變化外仿佛一切都沒發生過,這是為什么呢?

因為我們沒有入口,找不到可以打開我們的 Todo 應用的地方,接下來我們就一起創建第一個入口——菜單。

創建菜單

光有模型是當然不夠的,就好象一幢大樓,鋼筋骨架都搭起來了,然后把墻給封死了,沒有門我們進不去呀!

剛好像說了個不怎么恰當的比喻,不如直接動手,創建一個菜單更實際。在模塊里的 views 目錄下創建一個 menus.xml 文件,然后輸入以下內容:



    
        
        
        
        
            待辦事項
            todo.task
            form
            tree,form
            current
        
        
        
    

上面各部分內容我都寫上了備注,大家一看就應該知道它們各自是干什么的了。在 Odoo 中定義一個菜單,使用的是 menuitem,然后我們需要為菜單指定屬性 idname,前者是這個菜單的唯一標識,而后者則是這個菜單所顯示的名字。

然后我們定義了一個菜單動作,也就是點擊一個菜單時所要執行的動作,Odoo 中動作的類型分為幾個類型,從 model 這個屬性可以看出來一個動作是屬于什么類型的,act_window 表示我們定義的這個動作是和窗口有關的,例如打開一個彈窗或者一個列表頁面,都可以通過窗口動作實現。其他類型的動作我們先放一放,后面會有專門的一篇文章用于講述動作相關的內容,我們先簡單地了解一下定義一個窗口動作有哪些要素。

和定義菜單一樣,必不可少的會有 id 這一屬性,以后我們將默認所有在 .xml 文件中定義的數據,都需要帶有 id 屬性,畢竟這是我們能夠通過代碼找到它們的唯一標識了。這里我們用了 record 標簽,包裹了一系列的 field 來定義我們的動作,除了可以定義動作外,包括前面提到的菜單在內的一切具有實際模型的對應的數據,我們都可以這樣定義,最大的區別就在于 model 這個屬性所指定的值,它對應到我們定義的數據是來自哪個模型的,被包裹在里面的 field 則對應到一個模型的各個字段。剛開始可能不太明白,不過不要緊,后面會一直使用到,很快就能掌握的了。

最后我們定義了一個子菜單,可以看到和最開始定義的菜單不一樣的是,我們這里多了 3 個屬性,分別是 actionparentsequence。其中 action 的值是我們定義的動作的 id,表示點擊這個菜單,就執行對應 id 的動作,parent 指定的值是我們定義的第一個菜單的 id,表示當前菜單是指定菜單的子菜單,sequence 用于指定當前菜單的位置,如果我們在主菜單下有多個子菜單,我們可以通過這個屬性去指定各個子菜單排列的先后順序。

關于菜單和動作,暫時就先到這里,最后不要忘了把文件 menus.xml 放到 __manifest__.pydata 列表中,不然我們定義的內容是不會被加載的哦:

# 現在應該是這樣的
"data": [
    # "security/ir.model.access.csv",
    "views/views.xml",
    "views/templates.xml",
    "views/menus.xml",
],

好咧,菜單有了,也就有了入口,現在我們刷新頁面看看有沒有什么變化,好像還是一樣沒有什么不一樣?當然了,因為我們修改了模塊里的文件內容,這些變動并沒有被加載,所以我們需要先升級模塊。一樣的步驟,先找到我們的 Todo 應用模塊,然后點擊卡片進入表單頁面,可以看到有個 Upgrade 按鈕,我們點擊這個按鈕把模塊升級一下,然后你就會發現,我們終于看到了期待已久的菜單和 Todo 應用的列表頁面啦~

我們的 Todo 應用已經初具原型了,點擊 Create 按鈕,創建一些數據試試看吧 :)

還記得在創建模型的時候給字段 name 加上了一個 required=True 的屬性嗎?在創建記錄的表單頁我們可以看到,這個字段是淡紫色背景的,這說明這一項是必填的內容,如果不填寫,點擊 Save 按鈕,就會發現標簽顯示的「描述」變成了紅色,輸入框也被紅色邊框包裹起來了,并且可以看到在窗口右上角出現了一個警告提示。

在創建好一條待辦事項的記錄后,點擊 Save 保存,如果想要繼續創建,可以直接在表單頁上點擊 Create 繼續創建新的記錄,也可以返回列表頁查看全部的待辦事項記錄。如果完成了一個待辦事項,我們點擊對應的記錄,進入到表單頁面,然后點擊 Edit 編輯按鈕,然后勾選「已完成?」表示我們已經完成了這個任務。

想要刪除掉一些記錄該怎么辦?可以在列表頁先勾選需要刪除的記錄,然后點擊上面的 Action 菜單,可以看到 Delete 這個選項,點擊后會詢問是否要刪除,點擊 Ok 確認就可以刪除啦~除了列表頁上可以刪除記錄,還能打開一條待辦事項進入表單頁面,然后打開 Action 菜單執行刪除操作。

創建視圖

在創建菜單之后,我們直接就看到了相應的列表和表單頁面,可是我們并沒有創建任何相關的內容,這是 Odoo 自動幫我們做了處理。如果一個模型沒有創建對應的視圖(View),Odoo 就會根據默認的規則進行顯示。

可是默認在列表頁只顯示了一個 name 字段,我們想要知道一個事項是否完成了,并不能直接在列表頁上知道,需要一個個點擊進去查看,如果有很多的記錄,這可就太蛋疼了!所以我們還是需要自己創建一個列表視圖,把是否已完成顯示在列表頁上。

打開 views/views.xml,把里面注釋掉的內容都刪掉,然后添加以下內容:


    
        
            todo.task.view_tree
            todo.task
            tree
            
                
                    
                    
                
            
        
    

創建視圖相關的內容,我們需要指定屬性 model="ir.ui.view",然后還有兩個關鍵的地方是 type 的值,如果創建的是列表視圖,則填寫 tree,如果是表單視圖則是 form,除了這兩種視圖外還有其他類型的視圖,我們暫時不會接觸到。然后是 arch 的值,里面的內容決定了我們的視圖長什么樣,列表視圖需要用 包裹起來,表單視圖則是

,包裹的內容具會有所不同,這里我們只需要在列表視圖中將要顯示的字段列舉出來即可。

完成這一切之后,升級一下模塊,然后看看效果如何。

可以看到列表里多了一列「已完成?」,這樣我們就可以一目了然,知道哪些事項是已經完成了的,然后就可以直接勾選將他們刪除掉啦 XD

源碼下載

從這一篇教程開始,我會把所有代碼提交到 Github 的倉庫中,并且我會保留相應的文件修改的 commits 以供追溯,大家可以通過查看 commits 看到各個文件的變動,如果發現什么問題,也可以直接提 issue 尋求幫助?

倉庫地址:Odoo-Tutorial-Demo

相關文章

「Odoo 基礎教程系列」第〇篇——開天坑啦

「Odoo 基礎教程系列」第一篇——環境準備

微信群

最后慣例,感興趣的小伙伴可以加入微信群一起交流,加好友時備注加群,接受后會拉進群內。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44688.html

相關文章

  • Odoo 基礎教程系列」第六篇—— Todo 應用開始(5)

    摘要:大家好鴨,我又來更新啦還記得我們在第二篇教程中提到過的動作嗎,今天我們就來專門講講在中的,學習不同類型的動作對應的應用場景,并且在我們的應用中使用上其中一些類型的動作。報表動作這類型的動作用于觸發報表打印,例如打印發票等。 showImg(https://segmentfault.com/img/bVbhdTE?w=1471&h=845); 大家好鴨,我又來更新啦!還記得我們在第二篇教...

    Lionad-Morotar 評論0 收藏0
  • Odoo 基礎教程系列」第七篇—— Todo 應用開始(6)

    摘要:今天這個系列教程即將迎來它的最后一篇內容了,我們將要來學習中權限相關的內容。在的權限管理體系中,同樣也有用戶組這一概念的存在,和其他框架如可以說大同小異。通常和權限相關的內容,我們都會在模塊的目錄下進行定義,記錄集規則的定義自然也不例外。 在今年的情人節(2018.02.14)那天,我寫了一篇博客說即將要開一個坑,也就是大家在看的這個系列的教程。今天這個系列教程即將迎來它的最后一篇內容...

    zeyu 評論0 收藏0
  • Odoo 基礎教程系列」第三篇—— Todo 應用開始(2)

    摘要:現在我們來給待辦事項增加一個緊急程度的字段,用來表示當前任務的優先級。此處我們還給這個字段添加了默認值,表示當一個待辦事項被創建后,如果沒有指定緊急程度,將默認是待辦狀態。這篇教程中的代碼同樣會更新在我的倉庫中。 showImg(https://segmentfault.com/img/bVbfv3E?w=1330&h=912); 在這篇教程里我們將會了解到 Odoo 模型里的一些其他...

    iflove 評論0 收藏0
  • Odoo 基礎教程系列」第四篇—— Todo 應用開始(3)

    摘要:在這一篇教程中,將會涉及到外鍵字段,可以將兩個模型關聯起來,然后很方便地獲取到對應的數據。關聯字段這一小節里,我們會給待辦事項加上分類,并且這個分類可以讓用戶自己創建維護。今天這篇教程的內容就先到這里了,教程中的代碼會更新在我的倉庫中。 showImg(https://segmentfault.com/img/bVbfzvt?w=1280&h=795); 在這一篇教程中,將會涉及到外鍵...

    HollisChuang 評論0 收藏0
  • Odoo 基礎教程系列」第五篇—— Todo 應用開始(4)

    摘要:在前面教程中,我們使用了兩種類型的視圖和今天我們將學習使用另一種類型的視圖搜索視圖。大家可以試試看同時應用多個分組,或者將分組和過濾器組合使用,仔細觀察和思考產生的結果。還是老規矩,教程中的代碼會更新在倉庫中。 showImg(https://segmentfault.com/img/bVbgO85?w=1950&h=1300); 在前面教程中,我們使用了兩種類型的視圖——TreeVi...

    xiyang 評論0 收藏0

發表評論

0條評論

UCloud

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<