odoo開發教程十七:controller
一:controller簡述
odoo裡面的controller相似於springMVC,也是根據url來控制請求,把請求處理對映到具體某個方法上的。
類比於springmvc中,根據請求,在請求處理方法中處理資料,然後控制view頁面跳轉。
在odoo中的controller也是類似的工作原理:
在view層,新建xml檔案,定義檢視模版;
然後在controller目錄下,新建controller類,在其中,定義請求處理方法,在方法上方通過 @http:route('url',auth='public/user') 控制請求對映;
在方法中,處理資料,然後通過 http.request.render('模組名.檢視模版id',檢視模版所需引數列表......) 把引數傳遞給檢視模板並渲染出頁面,然後返回客戶端作響應。
二:一個簡單的課程列表展示
1:首先,新建一個檢視模板檔案
views/template.xml
<odoo> <data> <template id="template_index"> <t t-foreach="courses" t-as="course"> <p><t t-esc="course"/></p> </t> </template> </data> </odoo>
模版檔案解析:
id為:template_index
模版內容:遍歷 courses,並列印輸出。
2:在manifest中註冊檢視模版
'data': [ 'views/template.xml', ],
3:在controller資料夾下,新建controller.py
先在__init__.py匯入controller,否則odoo找不到。
# -*- coding: utf-8 -*- from odoo import http class Controller(http.Controller): @http.route("/open/courses/",auth="public") def index(self,**kw): return http.request.render("模組名.template_index",{'courses':['odoo','python','bootstarp']})
controller內容:
繼承 http.Controller類定義控制器;
通過 @http.route(url,auth=)控制請求對映,以及訪問許可權(公開 or 需要登陸)
最後,通過 http.request.render('模組名.檢視模板id',{'引數名'(與檢視模版中遍歷的引數一致):引數值}) 傳參並渲染得到響應頁面並返回。
4:啟動odoo,安裝/更新模組,然後通過 ip:8069/url 發起訪問,即可到達響應頁面。(url為上面定義控制器時的對映路徑)
三:使用ORM為檢視檔案傳遞內容
繼承自models.Model而定義的類預設具有了odoo的ORM介面,也就是說,該類的所有例項物件都會自動儲存到資料庫中。
根據這個特性,我們可以這樣往檢視模版傳遞資料:
定義一個數據模型;
在odoo中建立該資料模型的一系列紀錄(一條記錄一個例項物件);
在檢視檔案中,遍歷、使用物件,通過 物件.欄位名 呼叫紀錄的具體欄位內容;
最後,在控制器中,使用環境上下文,查詢該資料模型的所有紀錄,然後傳參即可。
在檢視檔案中遍歷物件,通過物件.欄位名呼叫資料:
<t t-foreach="courses" t-as="course"> <p><t t-esc="course.id"/></p> <p><t t-esc="course.name"/></p> </t>
在控制器中,先用環境上下文獲取資料模型的所有紀錄,得到一個紀錄集。然後通過 紀錄集.search()函式,返回一個紀錄列表,傳遞給檢視模板:
def index(self,**kw): #通過環境上下文獲取資料模型的所有紀錄 courses=http.request.env['openacademy.course'] #紀錄集.search(),返回紀錄列表傳遞給檢視模版進行渲染 return http.request.render("openacademy.template_index",{'courses':courses.search([])})
最後,更新模組,在模組中建立一些紀錄,然後通過url訪問,檢視紀錄集遍歷結果。