Odoo安装教程14-创建新的插件模块之网页和控制器

网页和控制器

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 应用的基本元素和步骤,但大多数情况下,我们的模块都是对已有应用添加功能来进行扩展,我们将在下一章中一起学习

更多教程:https://www.erpdaxue.cn/odoo/odoo-teach/

Odoo安装教程14-创建新的插件模块之网页和控制器

上一篇:2019-2020-2 20175313张黎仙《网络对抗技术》Exp9 Web安全基础


下一篇:ASP.NET Core下载大文件的实现