1.創(chuàng)建模塊
odoo提供scaffold命令用來(lái)快速創(chuàng)建模塊:
odoo scaffold <module name> <module directory>
2.模塊控制器
打開(kāi)module name文件夾,如mymodules/academy ,編輯controllers/controllers.py,在init.py進(jìn)行導(dǎo)入
# -*- 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,此處如果模塊文件夾不是默認(rèn),執(zhí)行的時(shí)候需要指定addon目錄(當(dāng)前路徑相對(duì)路徑或絕對(duì)路徑):
odoo --addons-path addons,mymodules
在開(kāi)發(fā)者模式下更新應(yīng)用列表,在設(shè)置-應(yīng)用右上角搜索欄中搜索academy(需去掉應(yīng)用過(guò)濾)安裝
,安裝完成后在瀏覽器輸入 localhost:8069/academy/academy即可看到簡(jiǎn)單的hello word頁(yè)面了
3.自定義模板
odoo自己開(kāi)發(fā)了一套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循環(huán)輸出,重啟odoo服務(wù),找到academy點(diǎn)擊升級(jí),刷新localhost:8069/academy/academy頁(yè)面會(huì)顯示新的內(nèi)容了
4.數(shù)據(jù)保存
- 模型定義
編輯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
此處即設(shè)置數(shù)據(jù)為對(duì)所有用戶(hù)只讀
所有xml和csv文件都需要在manifest內(nèi)進(jìn)行引入,controller和module文件需要在init內(nèi)進(jìn)入導(dǎo)入
- 測(cè)試數(shù)據(jù),編輯demo.xml
<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>
- 數(shù)據(jù)讀取
修改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
<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服務(wù),升級(jí)academy(升級(jí)時(shí)會(huì)自動(dòng)創(chuàng)建數(shù)據(jù)表,導(dǎo)入測(cè)試數(shù)據(jù)),重新打開(kāi)localhost:8069/academy/academy 此時(shí)展現(xiàn)的數(shù)據(jù)就是數(shù)據(jù)庫(kù)讀取出來(lái)的了
5.模塊用于網(wǎng)站
odoo提供了一個(gè)用于建立網(wǎng)站的模塊,接下來(lái)測(cè)試academy用于網(wǎng)站中
- 在manifest中將模塊定義為website:
'depends': ['website']
- 在controller中指定為website:
class Academy(http.Controller):
@http.route('/academy/academy/', auth='public', website=True)
- 在模板中添加website layout
<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),重新進(jìn)入academy頁(yè)面,頁(yè)面已經(jīng)用了網(wǎng)站前端的布局
6.鏈接和路由
在controller中通過(guò)route()裝飾器來(lái)處理請(qǐng)求,除了標(biāo)準(zhǔn)的URL之外,還可以接受參數(shù)型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,瀏覽器進(jìn)入academy/test和academy/1 所顯示出來(lái)的頁(yè)面是不一樣的,odoo還支持使用數(shù)據(jù)模型做參數(shù)
#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并升級(jí)模塊,輸入academy/1 查看效果
7.使模塊在菜單欄可見(jiàn)
默認(rèn)情況下,新建的模塊對(duì)用戶(hù)來(lái)說(shuō)是不可見(jiàn)的,需要?jiǎng)?chuàng)建一個(gè)菜單用戶(hù)才能在頁(yè)面中看到
#view.xml
<!-- 默認(rèn)列表 -->
<record id="action_academy_teachers" model="ir.actions.act_window">
<field name="name">Academy teachers</field>
<field name="res_model">academy.teachers</field>
</record>
<!-- 單條數(shù)據(jù)視圖 -->
<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并更新模塊,菜單會(huì)有academy入口了,默認(rèn)會(huì)展現(xiàn)一個(gè)列表,點(diǎn)進(jìn)去可編輯
8.數(shù)據(jù)模型相互關(guān)聯(lián)
建立一個(gè)課程表模型,每個(gè)課程需要有一個(gè)老師,課程表就需要有一個(gè)老師ID的字段來(lái)進(jìn)行關(guān)聯(lián),需要建立一個(gè)一對(duì)多的關(guān)系
#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 更新
<!-- 單條數(shù)據(jù)視圖 -->
<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"/>
此時(shí)重啟odoo并更新模塊,進(jìn)入academy,點(diǎn)擊菜單的course,看看會(huì)有什么
9.odoo聊天系統(tǒng)
odoo自帶聊天系統(tǒng),只需要在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>
10.odoo交易功能
odoo提供了website_sales的交易模塊,只需要做簡(jiǎn)單的修改就可以實(shí)現(xiàn)商品發(fā)布(安裝電子商務(wù)模塊)
#__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號(hào)</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 去掉前面步驟創(chuàng)建的課程視圖
<!-- 單條數(shù)據(jù)視圖 -->=
<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,打開(kāi)網(wǎng)站-商店,發(fā)現(xiàn)有添加的課程了
內(nèi)容發(fā)布自http://www.dingyii.cn,轉(zhuǎn)載請(qǐng)注明出處