本文是 Odoo 12.0 官方教程第二篇 建立网站
查看英文原文:
https://www.odoo.com/documentation/12.0/howtos/website.html
以下内容为机器翻译,半人工校对,仅供参考。
建立网站
警告
- 本指南假设 Python 的基本知识
- 本指南假设 已安装 Odoo
创建一个基本模块
在 Odoo,任务是通过创建模块。
模块定制的 Odoo 设施的行为,通过添加新的行为或改变现有的(包括行为由其他模块添加)。
Odoo 的脚手架 可以设置一个基本模块。很快开始简单地调用:
$ ./odoo-bin scaffold Academy my-modules
这将自动创建一个 my-modules
模块目录 和一个 academy
模块. 如果您想要的话,该目录可以是一个现有的模块目录,但该模块名必须是唯一的目录。
示范模块
我们有一个“完成”模块准备安装。
虽然它没有绝对没有,我们可以安装它:
-
启动 odoo 服务器
$ ./odoo-bin --addons-path addons,my-modules
打开 http://localhost:8069
创建一个新的数据库,包括演示数据
去 设置‣模块‣模块
在右上角的删除 Installed 过滤器然后搜索 academy
点击 Academy 模块的安装按钮
到浏览器
Controllers 解释浏览器请求并发送数据。
添加一个简单的控制器,并确保它是导入的 __init__.py
(所以,Odoo 可以找到它):
academy/controllers.py
# -*- coding: utf-8 -*-
from odoo import http
class Academy(http.Controller):
@http.route('/academy/academy/', auth='public')
def index(self, **kw):
return "Hello, world"
# @http.route('/academy/academy/objects/', auth='public')
# def list(self, **kw):
关闭您的服务器 (^C
) 然后重新启动它:
$ ./odoo-bin --addons-path addons,my-modules
打开一页 http://localhost:8069/academy/academy/, 你应该看到你的“页面”出现:
模板
在 Python 中生成 HTML 不总是水到渠成。
通常的解决方案是 templates, 伪文件的占位符和显示逻辑。Odoo 允许任何 Python 模板系统,但提供了自己 QWeb 模板系统集成了其他功能。
创建一个模板,确保模板文件被注册到 __manifest__.py
清单, 并改变控制器使用我们的模板:
academy/controllers.py
class Academy(http.Controller):
@http.route('/academy/academy/', auth='public')
def index(self, **kw):
return http.request.render('academy.index', {
'teachers': ["Diana Padilla", "Jody Caroll", "Lester Vaughn"],
})
# @http.route('/academy/academy/objects/', auth='public')
# def list(self, **kw):
academy/templates.xml
Academy
模板:(t-foreach
)对所有教师(通过 模板上下文),并打印每个老师在自己的段落。
最后重启 Odoo 和更新模块的数据(安装模板)去 设置‣模块‣模块之间的 ‣点击升级。
提示
另外,Odoo 可以重新开始 和更新模块在同一时间
:
$ odoo-bin --addons-path addons,my-modules -d academy -u academy
打开 http://localhost:8069/academy/academy/ 现在应该导致:
在 Odoo 存储数据
Odoo models map to database tables.
在上一节中我们只显示一个列表的字符串输入静态的 Python 代码。这不允许修改或持久存储,所以我们现在将我们的数据移到数据库中。
定义数据模型
定义一个教师模型,并确保它是从 __init__.py
所以它被正确地加载:
academy/models.py
from odoo import models, fields, api
class Teachers(models.Model):
_name = 'academy.teachers'
name = fields.Char()
然后设置 basic access control 为模型,并将它们添加到清单:
academy/manifest.py
# always loaded
'data': [
'security/ir.model.access.csv',
'templates.xml',
],
# only loaded in demonstration mode
academy/security/ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_academy_teachers,access_academy_teachers,model_academy_teachers,,1,0,0,0
这就简单地给出读访问 (perm_read
) 给所有用户 (group_id:id
left empty).
Note
数据文件 (XML 或 CSV) 必须添加到模块清单,Python 文件 (模型或控制器) 不要,但必须从进口 __init__.py
(直接或间接)
Warning
管理员用户绕过访问控制,他们可以访问所有的模型,即使无法获得
示范数据
第二步是向系统中添加一些演示数据,这样就可以很容易地测试它了。这是通过添加一个 demo
数据文件, 这必须从清单链接:
academy/demo.xml
Diana Padilla
Jody Carroll
Lester Vaughn
Tip
数据文件 可用于演示和非演示数据。演示数据只加载在“示范模式”,可用于流量测试和演示,非演示数据总是加载和用作初始系统设置。
在这种情况下,我们使用演示数据,因为该系统的实际用户将要输入或输入自己的老师列表,这个列表仅用于测试。
访问数据
最后一步是修改模型和模板来使用我们的演示数据:
- 从数据库中读取记录,而不是静态列表
- 因为
search()
返回一组匹配滤波器的记录(“所有记录”在这里),改变模板打印每一个老师的名字
academy/controllers.py
class Academy(http.Controller):
@http.route('/academy/academy/', auth='public')
def index(self, **kw):
Teachers = http.request.env['academy.teachers']
return http.request.render('academy.index', {
'teachers': Teachers.search([])
})
# @http.route('/academy/academy/objects/', auth='public')
academy/templates.xml
Academy
重新启动服务器并更新模块(以更新清单和模板并加载该演示文件)然后导航到http://localhost:8069/academy/academy/. 网页应该略有不同:名称应简单地以一个数字(老师用的数据库标识符)。
网站支持
Odoo 束模块致力于网站建设。
到目前为止,我们已经使用的控制器相当直接,但 Odoo 8 添加更深层次的整合和一些其他的服务(例如,默认的样式、主题)通过 网站
模块。
- 首先, 请添加
website
作为一个依赖academy
- 然后加入
website=True
控制器上的标志,这设置了一些新的变量 请求对象 并允许使用网站布局在我们的模板 - 使用网站布局模板
academy/manifest.py
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['website'],
# always loaded
'data': [
academy/controllers.py
from odoo import http
class Academy(http.Controller):
@http.route('/academy/academy/', auth='public', website=True)
def index(self, **kw):
Teachers = http.request.env['academy.teachers']
return http.request.render('academy.index', {
academy/templates.xml
Academy
在重新启动服务器的同时更新模块(以更新清单和模板)访问http://localhost:8069/academy/academy/ 应该得到一个更好的页面与品牌和一些内置的页面元素(顶级菜单,脚注,…)
网站的布局也提供了编辑工具支持:在 标志点击 (前右),填写证书 (admin
/ admin
默认) 然后点击 登录.
你现在在 Odoo “适当的”:管理界面。现在点击 网站 菜单(左上角。
我们回到网站,但作为管理员,获得高级版的功能 website 提供支持:
- 模板代码编辑器(自定义‣HTML编辑器),您可以查看和编辑用于当前页的所有模板
- 的 编辑 按钮在左上角切换到“编辑模式”在盖帽(片段)和富文本版是可用的
- 其他一些功能如移动预览或 SEO
网址和路由
控制器方法与 routes 通过 route()
设计师以路由串和一些属性来定制其行为或安全。
我们已经看到了一个“文本”的路由字符串,它匹配的一个地址部分,但也可以使用路由字符串 converter patterns 匹配位的网址,并使那些可用的本地变量。例如,我们可以创建一个新的控制器的方法,需要一点的网址和打印出来:
academy/controllers.py
'teachers': Teachers.search([])
})
@http.route('/academy//', auth='public', website=True)
def teacher(self, name):
return '{}
'.format(name)
# @http.route('/academy/academy/objects/', auth='public')
# def list(self, **kw):
# return http.request.render('academy.listing', {
重启 Odoo, 访问 http://localhost:8069/academy/Alice/ 和 http://localhost:8069/academy/Bob/ 看到差异。
正如名字所显示的, converter patterns 不要只做提取,他们也 验证 和 转换,所以我们可以改变新的控制器只接受整数:
academy/controllers.py
'teachers': Teachers.search([])
})
@http.route('/academy//', auth='public', website=True)
def teacher(self, id):
return '{} ({})
'.format(id, type(id).__name__)
# @http.route('/academy/academy/objects/', auth='public')
重启 Odoo, 访问 http://localhost:8069/academy/2, 请注意,旧的值是字符串,但新的一个被转换为一个整数。尝试访问 http://localhost:8069/academy/Carol/ 并注意到该页并没有找到:因为 “Carol” 是不是一个整数,这条路线被忽略,没有找到路线。
Odoo 提供了一个额外的转换称为 模型
提供记录时直接给他们的ID。让我们用这个来创建通用老师传记的一页:
academy/controllers.py
'teachers': Teachers.search([])
})
@http.route('/academy//', auth='public', website=True)
def teacher(self, teacher):
return http.request.render('academy.biography', {
'person': teacher
})
# @http.route('/academy/academy/objects/', auth='public')
academy/templates.xml