轉載請註明原文地址:http://www.javashuo.com/article/p-fwkynqmy-me.html html
一:controller簡述python
odoo裏面的controller類似於springMVC,也是根據url來控制請求,把請求處理映射到具體某個方法上的。spring
類比於springmvc中,根據請求,在請求處理方法中處理數據,而後控制view頁面跳轉。數據庫
在odoo中的controller也是相似的工做原理:mvc
在view層,新建xml文件,定義視圖模版;函數
而後在controller目錄下,新建controller類,在其中,定義請求處理方法,在方法上方經過 @http:route('url',auth='public/user') 控制請求映射;學習
在方法中,處理數據,而後經過 http.request.render('模塊名.視圖模版id',視圖模版所需參數列表......) 把參數傳遞給視圖模板並渲染出頁面,而後返回客戶端做響應。url
二:一個簡單的課程列表展現spa
1:首先,新建一個視圖模板文件code
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訪問,查看紀錄集遍歷結果。