1. 程式人生 > 其它 >odoo開發教程十七:controller

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訪問,檢視紀錄集遍歷結果。