聲明:
本教程基於 Ruter 老師的 [Odoo基礎教程系列] ,Ruter老師教程的鏈接地址為:Odoo基礎教程系列 。
本章內容總結
- 1.項目前置准備
- 2.創建模塊,模塊的簡單配置
- 3.model模型及模塊安裝
- 4.創建菜單視圖
- 5.添加應用到應用列表
- 6.創建任務列表視圖。
項目初始准備
如果你的odoo環境還沒有配合好的話,請參考我的另一篇文章:win10中odoo12環境配置
在配好環境之后,如果要啟動項目,需要添加如下配置:
1.將odoo-bin文件放在odoo源碼下,如果沒有odoo-bin文件,可以將odoo源碼下的一個odoo.py文件復制並更名為odoo-bin;
2.在 odoo源碼/setup/odoo.conf中添加odoo配置,內容如下:
3.pycharm下項目啟動配置,在綠色倒三角形旁邊
4.在odoo源碼的目錄下創建一個myaddons文件夾,用來存放自己編寫的odoo應用/模塊,這里我的odoo源碼是從gitee上下載的odoo12源碼;
為了讓odoo可以檢索到我們自定義myaddons下的模塊,我們要將myaddons的路徑加入到模塊檢索路徑下
在 odoo.conf 文件下添加如下配置:
addons_path=E:\YifChanSoft\Odoo\OdooSave\odoo_gitee\odoo\addons,E:\YifChanSoft\Odoo\OdooSave\odoo_gitee\myaddons
前一個是系統模塊的路徑,后面一個是我們自定義模塊文件夾的路徑
Todo應用
創建模塊
在配置好環境之后,win10下執行以下命令可以創建一個應用
python odoo-bin scaffold todo myaddons
以上命令代表,在myaddons目錄下創建一個名為todo的模塊。
目錄如下:
創建好todo模塊后,我們在 __mainfest__.py 編寫模塊的清單文件:
__mainfest__.py
{ 'name': "todo", # 應用/模塊名 'summary': """todo task""", # 對應用/模塊的摘要 'description': """Todo task-list the things you need to do.""", # 對應用/模塊的描述 'author': "YifChan", # 作者 'application': True, # 將模塊變成一個應用,可以在應用中搜索到 'sequence': 1, # 將應用/模塊排在所有應用/模塊的第一位 }
model模型及模塊安裝
在我們的todo應用中,todo任務模型要有 “待辦任務”和“已完成”兩個字段,
因此,我們在models/models.py中加入如下代碼:
models/models.py
from odoo import models, fields, api class TodoTask(models.Model): _name = 'todo.task' _description = '待辦事項' name = fields.Char('描述', required=True) is_done = fields.Boolean('已完成?')
在models/__inti__.py中添加如下代碼:
from . import models
此時我們的項目已經可以在應用中被找到了
打開瀏覽器進入 http://127.0.0.1:8069 ,如果你是第一次進入的話,可能需要進行如下配置
其中各個的含義如下:
- master password:數據庫中超級管理員的密碼
- database name:將為你現在odoo源碼創建的pg數據庫
- email:odoo管理員,可以不是郵箱,名字任取
- password:odoo管理員密碼
填寫進入后,我們點擊頁面左上角的田字形符號,選擇參數設置,點擊右邊的 激活開發者模式,截圖如下:
不要糾結我左上角的todo,這是因為我已經裝好並配置好了,原來只有todo下面的兩列。
激活開發者模式之后,我們繼續點擊田字形符號里的應用,然后點擊導航條上的刷新本地模塊列表。
這樣我們就可以在右上角的搜索框中搜索todo了,如果是模塊的話,記得叉掉應用后再查找模塊名,這里因為我們已經配置了todo為應用,所以可以直接查找,查找結果如下:
點擊安裝,然后會刷新,但是刷新后你會發現還是回到了應用頁面,並且再次搜索todo后,會顯示已安裝。
我們還不能進入todo應用頁面,這是因為我們還沒有給todo添加應用入口,下面我們來進行添加。
創建菜單
在views文件夾下,我們創建一個 views/todo_menus.xml 文件,並添加如下內容
<?xml version="1.0" encoding="utf-8"?> <odoo> <data> <!-- 主菜單定義 --> <menuitem id="menu_todo" name="Todo"/> <!-- 菜單動作定義 --> <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> <!-- 子菜單定義 --> <menuitem action="action_todo_task" id="submenu_todo_task" name="待辦事項" parent="menu_todo" sequence="10"/> </data> </odoo>
將todo_menus.xml文件添加入data列表中:
__mainfest__.py
'data': [ 'views/views.xml', 'views/templates.xml', 'views/todo_menus.xml', ],
搜索模塊,點擊模塊右上角的三點,進行升級模塊。
注意事項
- 在odoo中,如果你修改了xml文件,你所做的修改要升級應用后才能生效;
- 如果你修改了py文件,要重啟項目並且升級應用后才能使修改生效;但是我個人習慣,只要修改了,就重啟項目並且升級應用。
- 當你添加一個xml視圖文件或者權限文件后,要將文件放入應用下的__mainfest__.py文件的data列表中。
- 當你新建了一個python相關的文件夾,要在項目下的__init__.py文件中引入文件夾;
- 當你在應用下的某個文件夾中新建了一個要自動初始化的py文件,要在該文件夾中的__init__.py文件中引入你所添加的py文件。
以上幾點很重要,故在此統一列出,在后面可能不會再贅述,請讀者牢記。
添加應用到應用列表
到了上一步其實我們還是不能觀察到變化,這是因為我們還沒有添加應用到應用列表中,即左上角的田字形列表中,先展示一下效果圖:
為了實現這個,我們要確保一下三點:
- 1,有model模型,
- 2,在model模型的基礎上,menu.xml中有具體子菜單項及動作
- 3,在csv權限中有查看model的權限並將csv文件添加到data列表中
前面我們已經實現了model模型,和菜單xml,接下來我們實現第三點,
我們給security/ir.model.access.csv文件中添加如下內容:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_todo_task,todo.task,model_todo_task,,1,1,1,1
這里是給todo.task模型賦予增刪改查的權限。
做完這個我們還要將這個文件添加到data列表中,其實只要解開該文件的注釋即可,如下:
'data': [ 'security/ir.model.access.csv', ],
重啟項目,升級模塊。
至此,我們可以點擊左上角的下拉菜單並可以點擊todo應用來進入應用,我們可以看到如下內容:
你可以點擊創建一個任務看看。
創建任務列表視圖
通過上一步我們已經可以看到任務列表了,這個是系統為我們自動配置的視圖。
但是我們只能看到任務的name字段,而無法直接看見任務是否完成,此時,我們可以配置自己的視圖來按照自己的需求來顯示任務列表。
創建 views/todo_views.xml,並在其中加入如下內容
<odoo> <data> <!-- 待辦事項列表顯示視圖 --> <record id="todo_task_view_tree" model="ir.ui.view"> <field name="name">todo.task.view_tree</field> <field name="model">todo.task</field> <field name="type">tree</field> <field name="arch" type="xml"> <tree string="Todo"> <field name="name"/> <field name="is_done"/> </tree> </field> </record> </data> </odoo>
將todo_view.xml加入data列表中。
升級應用后我們可以看到如下內容:
本節內容基本到此結束了。
代碼匯總
todo/models/models.py

from odoo import models, fields, api class TodoTask(models.Model): _name = 'todo.task' _description = '待辦事項' name = fields.Char('描述', required=True) is_done = fields.Boolean('已完成?')
todo/security/ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_todo_task,todo.task,model_todo_task,,1,1,1,1
todo/views/todo_menus.xml

<?xml version="1.0" encoding="utf-8"?> <odoo> <data> <!-- 主菜單定義 --> <menuitem id="menu_todo" name="Todo"/> <!-- 菜單動作定義 --> <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> <!-- 子菜單定義 --> <menuitem action="action_todo_task" id="submenu_todo_task" name="待辦事項" parent="menu_todo" sequence="10"/> </data> </odoo>
todo/views/todo_views.xml

<?xml version="1.0" encoding="utf-8"?> <odoo> <data> <!-- 配置 待辦事項列表 顯示視圖 --> <record id="todo_task_view_tree" model="ir.ui.view"> <field name="name">todo.task.view_tree</field> <field name="model">todo.task</field> <field name="type">tree</field> <field name="arch" type="xml"> <tree string="Todo"> <field name="name"/> <field name="is_done"/> </tree> </field> </record> </data> </odoo>
todo/__mainfest__.py

{ 'name': "todo", 'summary': """ todo task""", 'description': """ Todo task-list the things you need to do. """, 'author': "YifChan", 'website': "http://www.yourcompany.com", # Categories can be used to filter modules in modules listing # Check https://github.com/odoo/odoo/blob/12.0/odoo/addons/base/data/ir_module_category_data.xml # for the full list 'category': 'Uncategorized', 'version': '0.1', # any module necessary for this one to work correctly 'depends': ['base'], # always loaded 'data': [ 'security/ir.model.access.csv', 'views/views.xml', 'views/templates.xml', 'views/todo_menus.xml', 'views/todo_views.xml', ], # only loaded in demonstration mode 'demo': [ 'demo/demo.xml', ], 'application': True, 'sequence': 1, }