網頁和控制器
Odoo 還提供了一個 web 開發框架,可用於開發與后台應用深度集成的功能。第一步我們來創建一個顯示有效圖書列表的簡單網頁。在請求 http:///library/books 頁面時會進行響應,所以/library/books 是用於實施的 URL。這里我們簡短地了解下 Odoo 網頁開發,這一話題在第十三章創建網站前端功能中會深入探討。
Web 控制器是負責渲染網頁的組件。控制器是 http.Controller 中定義的方法,與 URL 鏈接(endpoint)綁定。 訪問 URL 時執行控制器代碼,生成向用戶展示的 HTML。我們使用 QWeb模板引擎方便 HTML 的渲染。
按慣例控制器代碼放在/controllers 子目錄中,首先編輯 library_app/__init__.py 導入控制器模塊目錄:
from . import models
from . import controllers
然后添加 library_app/controllers/__init__.py 文件來讓目錄可被 Python 導入,並在該文件中添加:
from . import main
接下來就要創建真實的控制器文件 library_app/controllers/main.py,並添加如下代碼:
from odoo import http
class Books(http.Controller):
@http.route('/library/books', auth='user')
def list(self, **kwargs):
Book = http.request.env['library.book']
books = Book.search([])
return http.request.render(
'library_app.book_list_template', {'books':books})
這里導入的 odoo.http 模塊,是提供網頁相關功能的核心組件。 http.Controller 是需要繼承的類控制器,這里在主控制器類中使用。我們選擇的類名和方法並不關聯, @http.route 裝飾器才是重要的部分,它聲明了與類方法關聯的 URL 地址,此處為/books。默認訪問 URL 地址要求客戶登錄,推薦明確指出訪問的授權模式,所以這里添加了 auth=’ user’參數。要允許公開訪問,可為@http.route 添加 auth=’ public’ 參數。
“ 小貼士: 如果使用 auth=’ public’, 控制器代碼中在進行圖書搜索前應使用 sudo() 進行提權。這部分在第十三章創建網站前端功能會進一步討論。 ”
在這個控制器方法中,我們使用 http.request.env 獲取環境,使用它可從目錄中獲取有效圖書記錄集。最后一步是使用 http.request.render() 來處理 library_app.index_template Qweb 模板並生成輸出 HTML。可通過字典向模板傳值,這里傳遞了圖書記錄集。
這時如果重啟 Odoo 服務來重載 Python 代碼,並訪問/library/books 會得到一個錯誤日志:ValueError: External ID not found in the system: library_app.book_list_template。這是因為我們還沒有定義模板。下面就一起來定義模板。
QWeb 模板是一個視圖類型,應放在/views 子目錄下,我們來創建views/book_list_template.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="book_list_template" name="Book List">
<div id="wrap" class="container">
<h1>Books</h1>
<t t-foreach="books" t-as="book">
<div class="row">
<span t-field="book.name" />,
<span t-field="book.date_published" />,
<span t-field="book.publisher_id" />
</div>
</t>
</div>
</template>
</odoo>
</xml>
元素用於聲明 QWeb 模板,它事實上是一個存儲模塊的 base 模型 – ir.ui.view
記錄的快捷方式。模板中包含要使用的 HTML,並使用 Qweb 的特定屬性: t-foreach 用於遍歷變量 books 的每一項,通過控制器的 http.request.render()調用來獲取; t-field 用於渲染記錄字段的內容。這里僅簡單地使用 QWeb,更多詳情見第十三章創建網站前端功能。
在模塊的 manifest 中需要聲明該 XML 文件來供加載和使用。進行模塊升級即可通過http://:8069/library/books 來訪問有效圖書的簡單列表。
總結
本文中我們從 0 開始創建了一個新模塊,了解了模塊中常用的元素:模型、三個基礎視圖類型(表單視圖、列表視圖和搜索視圖)、模型方法中的業務邏輯和訪問權限。我們還學習了訪問權限控制,包括記錄規則以及如何使用網頁控制器和 Qweb 模板來創建網頁。
在學習過程中,我們熟悉了模塊開發過程,包含模塊升級和應用服務重啟來使得修改在 Odoo中生效。不要忘記在添加模塊字段時需要進行更新操作。修改含聲明在內的 Python 文件需要重啟服務。修改 XML 或 CSV 文件需進行更新,一旦不確定,同時進行重啟服務和升級模塊操作。
我們已經學習創建 Odoo 應用的基本元素和步驟,但大多數情況下,我們的模塊都是對已有應用添加功能來進行擴展,我們將在下一章中一起學習