1.创建模块
odoo提供scaffold命令用来快速创建模块:
odoo scaffold
2.模块控制器
打开module name文件夹,如mymodules/academy ,编辑controllers/controllers.py,在init.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"
保存,重启odoo,此处如果模块文件夹不是默认,执行的时候需要指定addon目录(当前路径相对路径或绝对路径):
odoo --addons-path addons,mymodules
在开发者模式下更新应用列表,在设置-应用右上角搜索栏中搜索academy(需去掉应用过滤)安装
,安装完成后在浏览器输入 localhost:8069/academy/academy即可看到简单的hello word页面了
3.自定义模板
odoo自己开发了一套QWeb模板引擎,修改controller让它加载自定义模板:
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"],
})
然后编辑template.xml,此模板在manifest.py中配置到data中加载:
Academy
此模板将teachers循环输出,重启odoo服务,找到academy点击升级,刷新localhost:8069/academy/academy页面会显示新的内容了
4.数据保存
- 模型定义
编辑models/models.py
class Teachers(models.Model):
_name = 'academy.teachers'
name = fields.Char()
编辑security/ir.model.access.csv并加入manifest.py
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
此处即设置数据为对所有用户只读
所有xml和csv文件都需要在manifest内进行引入,controller和module文件需要在init内进入导入
- 测试数据,编辑demo.xml
Diana Padilla
Jody Carroll
Lester Vaughn
- 数据读取
修改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([])
})
修改templates.xml
Academy
重启odoo服务,升级academy(升级时会自动创建数据表,导入测试数据),重新打开localhost:8069/academy/academy 此时展现的数据就是数据库读取出来的了
5.模块用于网站
odoo提供了一个用于建立网站的模块,接下来测试academy用于网站中
- 在manifest中将模块定义为website:
'depends': ['website']
- 在controller中指定为website:
class Academy(http.Controller):
@http.route('/academy/academy/', auth='public', website=True)
- 在模板中添加website layout
Academy
重启odoo并更新模块(加载template和manifest),重新进入academy页面,页面已经用了网站前端的布局
6.链接和路由
在controller中通过route()装饰器来处理请求,除了标准的URL之外,还可以接受参数型url,例:
@http.route('/academy//', auth='public', website=True)
def teacher(self, name):
return '{}
'.format(name)
@http.route('/academy//', auth='public', website=True)
def teacher_id(self, id):
return '{} ({})
'.format(id, type(id).__name__)
重启odoo,浏览器进入academy/test和academy/1 所显示出来的页面是不一样的,odoo还支持使用数据模型做参数
#controllers.py
@http.route('/academy//', auth='public', website=True)
def teacher(self, teacher):
return http.request.render('academy.biography', {
'person': teacher
})
#template.xml
Academy
重启odoo并升级模块,输入academy/1 查看效果
7.使模块在菜单栏可见
默认情况下,新建的模块对用户来说是不可见的,需要创建一个菜单用户才能在页面中看到
#view.xml
Academy teachers
academy.teachers
Academy teachers: form
academy.teachers
重启odoo并更新模块,菜单会有academy入口了,默认会展现一个列表,点进去可编辑
8.数据模型相互关联
建立一个课程表模型,每个课程需要有一个老师,课程表就需要有一个老师ID的字段来进行关联,需要建立一个一对多的关系
#models.py 添加
class Teachers(models.Model):
_name = 'academy.teachers'
name = fields.Char()
biography = fields.Html()
course_ids = fields.One2many('academy.courses', 'teacher_id', string="Courses")
class Courses(models.Model):
_name = 'academy.courses'
name = fields.Char()
teacher_id = fields.Many2one('academy.teachers', string="Teacher")
#ir.model.access.csv 添加
access_academy_courses,access_academy_courses,model_academy_courses,,1,0,0,0
#view.xml 更新
Academy teachers: form
academy.teachers
Academy courses
academy.courses
Academy courses: search
academy.courses
Academy courses: list
academy.courses
Academy courses: form
academy.courses
此时重启odoo并更新模块,进入academy,点击菜单的course,看看会有什么
9.odoo聊天系统
odoo自带聊天系统,只需要在models里引入mail.thread,添加messageid到表单中即可,下面为课程添加讨论功能
#__manifest__.py
'depends': ['base','mail'],
#models.py
class Courses(models.Model):
_name = 'academy.courses'
_inherit = 'mail.thread'
name = fields.Char()
teacher_id = fields.Many2one('academy.teachers', string="Teacher")
#views.xml
10.odoo交易功能
odoo提供了website_sales的交易模块,只需要做简单的修改就可以实现商品发布(安装电子商务模块)
#__manifest__.py
'depends': ['website_sale'],
'data': [
'security/ir.model.access.csv',
'views/views.xml',
'views/templates.xml',
'data/data.xml' #此处为新增
],
#data/data.xml 新增
Courses
#demo.xml
老师1号
Course 0
True
0
service
Course 1
True
0
service
Course 2
True
0
service
#models.py
class Teachers(models.Model):
_name = 'academy.teachers'
name = fields.Char()
biography = fields.Html()
course_ids = fields.One2many('product.template', 'teacher_id', string="Courses")
class Courses(models.Model):
_inherit = 'product.template'
name = fields.Char()
teacher_id = fields.Many2one('academy.teachers', string="Teacher")
#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
#views.xml 去掉前面步骤创建的课程视图
=
Academy teachers: form
academy.teachers
重启odoo,打开网站-商店,发现有添加的课程了
内容发布自http://www.dingyii.cn,转载请注明出处