odoo V10開(kāi)發(fā)文檔(入門(mén):建立網(wǎng)站)

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)注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,653評(píng)論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,063評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,835評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,235評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,459評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,819評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,004評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,257評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,676評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,937評(píng)論 1 288
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,717評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,003評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容