宜兴通达竭诚为您服务。

ODOO12图书项目继承 Web 控制器和模板

2020-10-22 05:10:00     作者: Administrator     来源:互联网,版权归作者所有     浏览次数: 76     文字大小:【】【】【

你没有登录,文章中的图片无法正常显示,请点击登录

Odoo 中的所有功能都带有扩展性,web 功能也不例外,所以已有控制器和模块都能被继承。

作为示例,我们将继承图书目录网页,加入前面添加的图书可用性信息:

  • 在控制器端添加对查询参数的支持,访问/library/books?available=1过滤出可借阅图书

  • 在模板端,添加一个图书不可用的表示

继承网页控制器

网页控制器不应包含实际业务逻辑,仅集中于展示逻辑。我们可能会需要添加对额外 URL 参数甚至是路由的支持,来改变网页的展示。我们将扩展/library/books来支持available=1参数,以过滤出可借阅图书。

要继承已有控制器,需导入对应对象,然后用方法新增逻辑来进行实现。下面新增ibrary_member/controllers/main.py文件并加入如下代码:

from odoo import http

from odoo.addons.library_app.controllers.main import Books

class BooksExtended(Books):

    @http.route()

    def list(self, **kwargs):

        response = super().list(**kwargs)

        if kwargs.get('available'):

            Book = http.request.env['library.book']

            books = Book.search([('is_available', '=', True)])

            response.qcontext['books'] = books

        return response

我们要继承的Books控制器在library_app/controllers/main.py中定义。因此需要通过odoo.addons.library_app.controllers.main导入。这和模型不同,模型可以通过 env 对象中的central registry 来引用任意模型类,而无需了解实现它的文件。控制器没有这个,我们需要知道实现需继承控制器的模块和文件。

然后基于Books声明了一个BooksExtended类,类名不具关联性,仅用于继承和扩展原类中定义的方法。

再后我们(重)定义了一个控制器方法 list()。它至少需要一个简单的@http.route()装饰器来保持路径活跃。如果不带参数,将会保留父类中定义的路由。但也可以为@http.route() 装饰器添加参数,来重新定义或替换类路由。

在继承的 list()方法中,一开始使用了 super()来运行已有代码。处理结果返回一个 Response 对象,Response 带有模块要渲染的属性 template,以及渲染使用的上下文qcontext。但还需要生成 HTML,仅会在控制器结束运行时生成。这也让我们可以在最终渲染完成之前可以修改 Response 属性。

list()方法带有**kwargs参数,捕获所有kwargs字典中的参数。这些是 URL 中的参数,如?available=1。方法检测kwargs中available键的值,检测到后改变qcontext来获取仅为可借阅图书的图书记录集。

还要记得让模块知道这个新 Python 文件,需通过将 controllers 子文件夹中添加到library_member/__init__.py中:

from . import models

from . import controllers
在library_member/controllers/__init__.py文件中添加一行代码:

from . import main

然后更新模板并访问http://<your-server>:8069/library/books?available=1 将仅显示勾选了Is Available? 的图书


继承 QWeb 模板
要修改网页的实际展示,就需要继承所使用的 QWeb 模板。我们将继承library_app.book_list_template来展示更多有关不可借阅图书的信息。添加library_member/views/book_list_template.xml文件并加入如下代码:

<odoo>

<template id="book_list_extended"

name="Extended Book List"

inherit_id="library_app.book_list_template">

<xpath expr="//span[@t-field='book.publisher_id']" position="after">

<t t-if="not book.is_available">

<b>(Not Available)</b>

</t>

</xpath>

</template>

</odoo>

网页模板像其它 Odoo 视图类型一样是 XML 文件,同样也可以使用 XPath 来定位元素并对它们进行操作。所继承模型通过在元素中的inherit_id来指明。

然后在 library_member/__manifest__.py文件中加入该文件的声明:

'data': [

'views/book_view.xml',

'security/library_security.xml',

'security/ir.model.access.csv',

'views/member_view.xml',

'views/library_menu.xml',

'views/book_list_template.xml',

],

更新后访问http://<your-server>:8069/library/books即可对不可借阅图书展示额外的(Not Available)信息。


演示视频:

http://www.tderp.com/download/details/odoo12-web-864

http://ctdrive.tderp.com/file/13502532-467789777


相关文章 评论

服务原则及地区范围

宜兴通达团队,在企业网络维护和企业信息化建设与咨询方面,有10多年经验。

我团队愿与客户一道,力求彻底解决客户问题!
我们不是在给企业提供“头痛医头、脚痛医脚”的暂时解决方案,而是在部署根本性安全与稳定服务!!
我们愿携手客户,建立企业IT规划;杜绝随意安装系统、软件等操作;力求共同维护有序、安全、稳定的网络办公环境!!!
IT服务,服务是根本,客户是上帝;我们提供快速响应、快速上门、快速排查,提供优质高效的服务!!!!

通达团队提供全国范围内的服务,服务形式包括远程协助、电话咨询、电子邮件咨询、传真咨询、问答平台的问题解决等。

宜兴地区提供上门服务:

  • 市区服务:宜城街道、城北街道(屺亭街道)、新街街道、新庄街道、环科园、渚桥开发区
  • 市郊服务:张渚镇、西渚镇、太华镇、徐舍镇、官林镇、杨巷镇、新建镇、和桥镇、高塍镇、万石镇、周铁镇、芳桥镇、丁蜀镇、湖父镇。
  • 联系电话:189-21-343434
  • 在线沟通: