发表日期:2017-04 文章编辑:小灯 浏览次数:1058
odoo提供scaffold命令用来快速创建模块:
odoo scaffold <module name> <module directory>
打开module name文件夹,如mymodules/academy ,编辑controllers/controllers.py,在init.py进行导入
# -*- coding: utf-8 -*- from odoo import httpclass 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页面了
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中加载:
<odoo> <data> <template id="index"> <title>Academy</title> <t t-foreach="teachers" t-as="teacher"> <p><t t-esc="teacher"/></p> </t> </template> </data> </odoo>
此模板将teachers循环输出,重启odoo服务,找到academy点击升级,刷新localhost:8069/academy/academy页面会显示新的内容了
编辑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内进入导入
<odoo> <data> <record id="padilla" model="academy.teachers"> <field name="name">Diana Padilla</field> </record> <record id="carroll" model="academy.teachers"> <field name="name">Jody Carroll</field> </record> <record id="vaughn" model="academy.teachers"> <field name="name">Lester Vaughn</field> </record> </data> </odoo>
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
<template id="index"> <title>Academy</title> <t t-foreach="teachers" t-as="teacher"> <p><t t-esc="teacher.id"/> <t t-esc="teacher.name"/></p> </t> </template>
重启odoo服务,升级academy(升级时会自动创建数据表,导入测试数据),重新打开localhost:8069/academy/academy 此时展现的数据就是数据库读取出来的了
odoo提供了一个用于建立网站的模块,接下来测试academy用于网站中
'depends': ['website']
class Academy(http.Controller): @http.route('/academy/academy/', auth='public', website=True)
<template id="index"> <t t-call="website.layout"> <t t-set="title">Academy</t> <div class="oe_structure"> <div class="container"> <t t-foreach="teachers" t-as="teacher"> <p><t t-esc="teacher.id"/> <t t-esc="teacher.name"/></p> </t> </div> </div> </t> </template>
重启odoo并更新模块(加载template和manifest),重新进入academy页面,页面已经用了网站前端的布局
在controller中通过route()装饰器来处理请求,除了标准的URL之外,还可以接受参数型url,例:
@http.route('/academy/<name>/', auth='public', website=True) def teacher(self, name): return '<h1>{}</h1>'.format(name)@http.route('/academy/<int:id>/', auth='public', website=True) def teacher_id(self, id): return '<h1>{} ({})</h1>'.format(id, type(id).__name__)
重启odoo,浏览器进入academy/test和academy/1 所显示出来的页面是不一样的,odoo还支持使用数据模型做参数
#controllers.py @http.route('/academy/<model("academy.teachers"):teacher>/', auth='public', website=True) def teacher(self, teacher): return http.request.render('academy.biography', { 'person': teacher })#template.xml <template id="biography"> <t t-call="website.layout"> <t t-set="title">Academy</t> <div class="oe_structure"/> <div class="oe_structure"> <div class="container"> <p><t t-esc="person.id"/> <t t-esc="person.name"/></p> </div> </div> <div class="oe_structure"/> </t> </template>
重启odoo并升级模块,输入academy/1 查看效果
默认情况下,新建的模块对用户来说是不可见的,需要创建一个菜单用户才能在页面中看到
#view.xml<!-- 默认列表 --> <record id="action_academy_teachers" model="ir.actions.act_window"> <field name="name">Academy teachers</field> <field name="res_model">academy.teachers</field> </record><!-- 单条数据视图 --><record id="academy_teacher_form" model="ir.ui.view"> <field name="name">Academy teachers: form</field> <field name="model">academy.teachers</field> <field name="arch" type="xml"> <form> <sheet> <label for="name"/> <field name="name"/> <label for="biography"/> <field name="biography"/> </sheet> </form> </field> </record><!-- 菜单 --> <menuitem sequence="0" id="menu_academy" name="Academy"/> <menuitem id="menu_academy_content" parent="menu_academy" name="Academy Content"/> <menuitem id="menu_academy_content_teachers" parent="menu_academy_content" action="action_academy_teachers"/>
重启odoo并更新模块,菜单会有academy入口了,默认会展现一个列表,点进去可编辑
建立一个课程表模型,每个课程需要有一个老师,课程表就需要有一个老师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 更新 <!-- 单条数据视图 --><record id="academy_teacher_form" model="ir.ui.view"> <field name="name">Academy teachers: form</field> <field name="model">academy.teachers</field> <field name="arch" type="xml"> <form> <sheet> <label for="name"/> <field name="name"/><label for="biography"/> <field name="biography"/><field name="course_ids"> <tree string="Courses" editable="bottom"> <field name="name"/> </tree> </field> </sheet> </form> </field> </record> <!-- 课程视图 --> <record id="action_academy_courses" model="ir.actions.act_window"> <field name="name">Academy courses</field> <field name="res_model">academy.courses</field> </record> <record id="academy_course_search" model="ir.ui.view"> <field name="name">Academy courses: search</field> <field name="model">academy.courses</field> <field name="arch" type="xml"> <search> <field name="name"/> <field name="teacher_id"/> </search> </field> </record> <record id="academy_course_list" model="ir.ui.view"> <field name="name">Academy courses: list</field> <field name="model">academy.courses</field> <field name="arch" type="xml"> <tree string="Courses"> <field name="name"/> <field name="teacher_id"/> </tree> </field> </record> <record id="academy_course_form" model="ir.ui.view"> <field name="name">Academy courses: form</field> <field name="model">academy.courses</field> <field name="arch" type="xml"> <form> <sheet> <label for="name"/> <field name="name"/> <label for="teacher_id"/> <field name="teacher_id"/> </sheet> </form> </field> </record><!-- 菜单 --> <menuitem sequence="0" id="menu_academy" name="Academy"/> <menuitem id="menu_academy_content" parent="menu_academy" name="Academy Content"/> <menuitem id="menu_academy_content_courses" parent="menu_academy_content" action="action_academy_courses"/> <menuitem id="menu_academy_content_teachers" parent="menu_academy_content" action="action_academy_teachers"/>
此时重启odoo并更新模块,进入academy,点击菜单的course,看看会有什么
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 <form> <sheet> <label for="name"/> <field name="name"/> <label for="teacher_id"/> <field name="teacher_id"/> </sheet> <div class="oe_chatter"> <field name="message_follower_ids" widget="mail_followers"/> <field name="message_ids" widget="mail_thread"/> </div> </form>
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 新增 <odoo> <data> <record model="product.public.category" id="category_courses"> <field name="name">Courses</field> <field name="parent_id" ref=""/> </record> </data> </odoo>#demo.xml <record id="padilla" model="academy.teachers"> <field name="name">老师1号</field> </record> <record id="course0" model="product.template"> <field name="name">Course 0</field> <field name="teacher_id" ref="padilla"/> <field name="public_categ_ids" eval="[(4, ref('academy.category_courses'), False)]"/> <field name="website_published">True</field> <field name="list_price" type="float">0</field> <field name="type">service</field> </record> <record id="course1" model="product.template"> <field name="name">Course 1</field> <field name="teacher_id" ref="padilla"/> <field name="public_categ_ids" eval="[(4, ref('academy.category_courses'), False)]"/> <field name="website_published">True</field> <field name="list_price" type="float">0</field> <field name="type">service</field> </record> <record id="course2" model="product.template"> <field name="name">Course 2</field> <field name="teacher_id" ref="vaughn"/> <field name="public_categ_ids" eval="[(4, ref('academy.category_courses'), False)]"/> <field name="website_published">True</field> <field name="list_price" type="float">0</field> <field name="type">service</field> </record>#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 去掉前面步骤创建的课程视图 <!-- 单条数据视图 -->= <record id="academy_teacher_form" model="ir.ui.view"> <field name="name">Academy teachers: form</field> <field name="model">academy.teachers</field> <field name="arch" type="xml"> <form> <sheet> <label for="name"/> <field name="name"/><label for="biography"/> <field name="biography"/><field name="course_ids"> <tree string="Courses" editable="bottom"> <field name="name"/> </tree> </field> </sheet> </form> </field> </record> <menuitem sequence="0" id="menu_academy" name="Academy"/> <menuitem id="menu_academy_content" parent="menu_academy" name="Academy Content"/> <menuitem id="menu_academy_content_teachers" parent="menu_academy_content" />
重启odoo,打开网站-商店,发现有添加的课程了
内容发布自http://www.dingyii.cn,转载请注明出处
日期:2019-02 浏览次数:6485
日期:2019-02 浏览次数:4221
日期:2019-02 浏览次数:3972
日期:2019-02 浏览次数:4449
日期:2019-02 浏览次数:4145
日期:2019-02 浏览次数:7303
日期:2019-02 浏览次数:4008
日期:2019-02 浏览次数:4496
日期:2019-02 浏览次数:4353
日期:2019-02 浏览次数:4022
日期:2019-02 浏览次数:4361
日期:2019-02 浏览次数:4144
日期:2019-02 浏览次数:4032
日期:2019-02 浏览次数:3957
日期:2019-02 浏览次数:4690
日期:2019-02 浏览次数:4155
日期:2019-02 浏览次数:4151
日期:2019-02 浏览次数:4204
日期:2019-02 浏览次数:4162
日期:2019-02 浏览次数:4081
日期:2019-02 浏览次数:4448
日期:2019-09 浏览次数:4475
日期:2019-09 浏览次数:4121
日期:2019-09 浏览次数:4135
日期:2019-09 浏览次数:4089
日期:2019-09 浏览次数:4067
日期:2019-09 浏览次数:4164
日期:2019-09 浏览次数:4111
日期:2019-09 浏览次数:4582
日期:2019-09 浏览次数:5100
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.