第十三章 Odoo 12开发之创建网站前端功能

本文为最好用的免费ERP系统Odoo 12开发手册系列文章第十三篇。

Odoo 起初是一个后台系统,但很快就有了前端界面的需求。早期基于后台界面的门户界面不够灵活并且对移动端不友好。为解决这一问题,Odoo 引入了新的网站功能,为系统添加了 CMS(Content Management System)内容管理系统。这使得我们无需集成第三方 CMS 便可创建美观又高效的前端。本文中我们将学习如何利用 Odoo 自带的网站功能开发面向前端的插件模块。

本文主要内容有:

  • 学习项目 – 自助图书馆
  • 第一个网页
  • 创建网站

开发准备

我将用第十一章 Odoo 12开发之看板视图和用户端 QWeb中最后编辑的library_checkout插件模块,代码请见GitHub 仓库。本文完成后的代码也请参见GitHub 仓库。

学习项目 – 自助图书馆

本文中我们将为图书会员添加一个自助服务功能。可供会员分别登录账号来访问他们的借阅请求列表。这样我们就可以学习网站开发的基本技术:创建动态页面、在页面间传递参数、创建表单以及处理表单数据验证。对这些新的图书网站功能,我们要新建一个插件模块library_website。

大家应该已经轻车熟路了,首先创建插件的声明文件ibrary_website/__manifest__.py,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

{

    'name': 'Library Website',

    'description': 'Create and check book checkout requests.',

    'author': 'Alan Hou',

    'depends': [

        'library_checkout'

    ],

    'data': [

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

        'security/library_security.xml',

        'views/library_member.xml',

    ],

}

网站功能将会依赖于library_checkout。我们并没有添加对website核心插件模块的依赖。website插件为创建完整功能的网站提供了有用的框架,但现在我们仅探讨核心框架自带的基础网站功能,尚无需使用website。我们想要图书会员通过登录信息在图书网站上访问自己的借阅请求。为此需要在图书会员模型中添加一个user_id字段,需要分别在模型和视图中添加,下面就开始进行网站的创建:

1、添加library_website/models/library_member.py文件

1

2

3

4

5

from odoo import fields, models

class Member(models.Model):

    _inherit = 'library.member'

    user_id = fields.Many2one('res.users')

2、添加library_website/models/__init__.py文件:

1

from . import library_member

3、添加library_website/__init__.py文件:

1

from . import models

4、添加library_website/views/library_member.xml文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

    

        Member Form

        library.member

        

        

            

                

            

        

    

访问这些网页的都是门户用户,无需访问后台菜单。我们需要为这个用户组设置安全访问权限,否则会在使用图书网站功能时报权限错误。

5、添加library_website/security/ir.model.access.csv文件,添加对图书模型的读权限:

1

2

3

4

5

6

7

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

access_book_portal,Book Portal Access,library_app.model_library_book,base.group_

portal,1,0,0,0

access_member_portal,Member Portal Access,library_member.model_library_member,ba

se.group_portal,1,0,0,0

access_checkout_portal,Checkout Portal Access,library_checkout.model_library_che

ckout,base.group_portal,1,0,0,0

6、在library_website/security/library_security.xml文件中添加记录规则来限制门户用户所能访问的记录:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

    

        

            Library Member Portal Access

            

            

                [('user_id', '=', user.id)]

            

            

        

        

            Library Checkout Portal Access

            

            

                [('member_id.user_id', '=', user.id)]

            

            

        

    

base.group_portal是门户用户组的标识符。在创建门户用户时,应设置他们的用户类型为 Portal,而不是Internal User。这会让他们属于门户用户组并继承我们上面定义的访问权限:

第十三章 Odoo 12开发之创建网站前端功能_第1张图片

补充:以上内容需开启开发者模式才可见

一旦为图书会员创建了一个门户用户,就应在我们会员表单中的用户字段中使用。该登录信息将可以访问相应会员的借阅请求。

小贴士:在模型中使用 ACL 和记录规则来实现安全权限比使用控制器的逻辑要更为安全。这是因为攻击者有可能跳过网页控制器直接使用RPC 来访问模型 API 。

了解了这些,我们就可以开始实现图书网站的功能了。但首先我们来使用简单的Hello World网页简短地介绍下基本网站概念。

第一个网页

要开始了解 Odoo 网页开发的基础,我们将先实现一个Hello World网页来展示基本概念和技术。很有想象空间,是不是?

要创建第一个网页,我们需要一个控制器对象。首先来添加controllers/hello.py文件:

1、在library_website/__init__.py文件中添加如下行:

1

from . import controllers

2、在library_website/controllers/__init__.py文件中添加如下行:

1

from . import hello

3、添加实际的控制器文件 library_website/controllers/hello.py,代码如下:

1

2

3

4

5

6

from odoo import http

class Hello(http.Controller):

    @http.route('/helloworld', auth="public")

    def helloworld(self):

        return('

Hello World!

')

odoo.http模块提供 Odoo 网页相关的功能。我们用于渲染页面的控制器,应该是一个继承了odoo.http.Controller类的对象。实际使用的名称并不是太重要,这里选择了 Hello(),一个常用的选择是 Main()。

在控制器类中使用了匹配 URL 路由的方法。这些路由用于做一些处理并返回结果,通常是返回用户网页浏览器的 HTML 页面。odoo.http.route装饰器用于为 URL 路由绑定方法,本例中使用的是/helloworld 路由。

安装library_website模块(~/odoo-dev/odoo/odoo-bin -d dev12 -i library_website)就可以在浏览器中打开http://xxx:8069/helloworld,我们应该就可以看到Hello World问候语了。

本例中方法执行的处理非常简单,它返回一个带有 HTML 标记的文本字符串,Hello World。

ℹ️使用这里的简单 URL 访问按制器,如果同一 Odoo 实例有多个数据库时,在没有指定目标数据库的情况下将会失败。这可通过在启动配置中设置-d或–db-filter来解决,参见第二章 Odoo 12开发之开发环境准备。

你可能注意到在路由装饰中使用了auth=’public’参数,对于无需登录的用户开放的页面就需要使用它。如果删除该参数,仅有登录用户方可浏览此页面。如果没有活跃会话(session)则会进入登录页面。

小贴士:auth=’public’参数实际表示如果访客未登录则使用public特殊用户运行网页控制器。如果登录了,则使用登录用户来代替public。

第十三章 Odoo 12开发之创建网站前端功能_第2张图片

使用 QWeb 模板的 Hello World

使用 Python 字符串来创建 HTML 很快就会觉得乏味。QWeb可用来增添色彩,下面就使用模板来写一个改进版的Hello World网页。QWeb模板通过 XML 数据文件添加,技术层面上它是与表单、列表视图类似的一种视图类型。它们甚至存储在同一个技术模型ir.ui.view中。

老规矩,需要在声明文件中添加声明来加载文件,编辑library_website/__manifest__.py文件并添加内容如下:

1

2

3

4

'data': [

...

  'views/helloworld_template.xml',

],

然后添加实际的数据文件views/helloworld_template.xml,内容如下:

1

2

3

4

5

6