本文是 Odoo 9.0 官方教程第二篇 建立網(wǎng)站
查看英文原文:
https://www.odoo.com/documentation/9.0/howtos/website.html
以下內容為機器翻譯黄伊,半人工校對,僅供參考屡江。
建立網(wǎng)站
警告
- 本指南假設 Python的基本知識
- 本指南假設 已安裝Odoo
創(chuàng)建一個基本模塊
在Odoo稿蹲,任務是通過創(chuàng)建模塊虑乖。
模塊定制的Odoo設施的行為挨务,通過添加新的行為或改變現(xiàn)有的(包括行為由其他模塊添加)纯丸。
Odoo的腳手架 can 設置一個基本模塊晌畅。很快開始簡單地調用:
$ ./odoo.py scaffold Academy my-modules
這將自動創(chuàng)建一個 my-modules
模塊目錄 和一個 academy
模塊. 如果您想要的話但指,該目錄可以是一個現(xiàn)有的模塊目錄,但該模塊名必須是唯一的目錄。
示范模塊
我們有一個“完成”模塊準備安裝枚赡。
雖然它沒有絕對沒有,我們可以安裝它:
- 啟動odoo服務器
~~~
$ ./odoo.py --addons-path addons,my-modules
~~~
- 打開 http://localhost:8069
- 創(chuàng)建一個新的數(shù)據(jù)庫谓谦,包括演示數(shù)據(jù)
- 去 設置?模塊?模塊
- 在右上角的刪除 Installed 過濾器然后搜索 academy
- 點擊 Academy 模塊的安裝按鈕
到瀏覽器
Controllers 解釋瀏覽器請求并發(fā)送數(shù)據(jù)贫橙。
添加一個簡單的控制器,并確保它是導入的 __init__.py
(所以反粥,Odoo可以找到它):
academy/controllers.py
# -*- coding: utf-8 -*-
from openerp 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.py --addons-path addons,my-modules
打開一頁 http://localhost:8069/academy/academy/, 你應該看到你的“頁面”出現(xiàn):
[圖片上傳失敗...(image-232951-1614764647435)]
模板
在Python中生成HTML不總是水到渠成卢肃。
通常的解決方案是 templates, 偽文件的占位符和顯示邏輯。Odoo允許任何Python模板系統(tǒng)才顿,但提供了自己 QWeb 模板系統(tǒng)集成了其他功能莫湘。
創(chuàng)建一個模板,確保模板文件被注冊到 __openerp__.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
<openerp>
<data>
<template id="index">
<title>Academy</title>
<t t-foreach="teachers" t-as="teacher">
<p><t t-esc="teacher"/></p>
</t>
</template>
<!-- <template id="object"> -->
<!-- <h1><t t-esc="object.display_name"/></h1> -->
<!-- <dl> -->
模板:(t-foreach
)對所有教師(通過 模板上下文)郑气,并打印每個老師在自己的段落幅垮。
最后重啟Odoo和更新模塊的數(shù)據(jù)(安裝模板)去 設置?模塊?模塊之間的 ?點擊升級。
提示
另外尾组,Odoo可以重新開始 和更新模塊在同一時間
:
$ odoo.py --addons-path addons,my-modules -d academy -u academy
打開 http://localhost:8069/academy/academy/ 現(xiàn)在應該導致:
在Odoo存儲數(shù)據(jù)
Odoo models map to database tables.
在上一節(jié)中我們只顯示一個列表的字符串輸入靜態(tài)的Python代碼忙芒。這不允許修改或持久存儲,所以我們現(xiàn)在將我們的數(shù)據(jù)移到數(shù)據(jù)庫中讳侨。
定義數(shù)據(jù)模型
定義一個教師模型呵萨,并確保它是從 __init__.py
所以它被正確地加載:
academy/models.py
from openerp import models, fields, api
class Teachers(models.Model):
_name = 'academy.teachers'
name = fields.Char()
然后設置 basic access control 為模型,并將它們添加到清單:
academy/openerp.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
數(shù)據(jù)文件 (XML 或 CSV) 必須添加到模塊清單跨跨,Python文件 (模型或控制器) 不要潮峦,但必須從進口 __init__.py
(直接或間接)
Warning
管理員用戶繞過訪問控制,他們可以訪問所有的模型勇婴,即使無法獲得
示范數(shù)據(jù)
第二步是向系統(tǒng)中添加一些演示數(shù)據(jù)忱嘹,這樣就可以很容易地測試它了。這是通過添加一個 demo
數(shù)據(jù)文件, 這必須從清單鏈接:
academy/demo.xml
<openerp>
<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>
</openerp>
Tip
數(shù)據(jù)文件 可用于演示和非演示數(shù)據(jù)耕渴。演示數(shù)據(jù)只加載在“示范模式”德谅,可用于流量測試和演示,非演示數(shù)據(jù)總是加載和用作初始系統(tǒng)設置萨螺。
在這種情況下窄做,我們使用演示數(shù)據(jù),因為該系統(tǒng)的實際用戶將要輸入或輸入自己的老師列表慰技,這個列表僅用于測試椭盏。
訪問數(shù)據(jù)
最后一步是修改模型和模板來使用我們的演示數(shù)據(jù):
- 從數(shù)據(jù)庫中讀取記錄,而不是靜態(tài)列表
- 因為
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
<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>
<!-- <template id="object"> -->
重新啟動服務器并更新模塊(以更新清單和模板并加載該演示文件)然后導航到http://localhost:8069/academy/academy/. 網(wǎng)頁應該略有不同:名稱應簡單地以一個數(shù)字(老師用的數(shù)據(jù)庫標識符)掏颊。
網(wǎng)站支持
Odoo束模塊致力于網(wǎng)站建設。
到目前為止,我們已經(jīng)使用的控制器相當直接乌叶,但Odoo 8添加更深層次的整合和一些其他的服務(例如盆偿,默認的樣式、主題)通過 網(wǎng)站
模塊准浴。
- 首先, 請?zhí)砑?
website
作為一個依賴academy
- 然后加入
website=True
控制器上的標志事扭,這設置了一些新的變量 請求對象 并允許使用網(wǎng)站布局在我們的模板 - 使用網(wǎng)站布局模板
academy/openerp.py
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['website'],
# always loaded
'data': [
academy/controllers.py
from openerp 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
<openerp>
<data>
<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>
<!-- <template id="object"> -->
在重新啟動服務器的同時更新模塊(以更新清單和模板)訪問http://localhost:8069/academy/academy/ 應該得到一個更好的頁面與品牌和一些內置的頁面元素(頂級菜單,腳注乐横,…)
網(wǎng)站的布局也提供了編輯工具支持:在 標志點擊 (前右)求橄,填寫證書 (admin
/ admin
默認) 然后點擊 登錄.
你現(xiàn)在在Odoo“適當?shù)摹保汗芾斫缑妗,F(xiàn)在點擊 網(wǎng)站 菜單(左上角葡公。
我們回到網(wǎng)站罐农,但作為管理員,獲得高級版的功能 website 提供支持:
- 模板代碼編輯器(自定義?HTML編輯器)催什,您可以查看和編輯用于當前頁的所有模板
- 的 編輯 按鈕在左上角切換到“編輯模式”在蓋帽(片段)和富文本版是可用的
- 其他一些功能如移動預覽或 SEO
網(wǎng)址和路由
控制器方法與 routes 通過 route()
設計師以路由串和一些屬性來定制其行為或安全涵亏。
我們已經(jīng)看到了一個“文本”的路由字符串,它匹配的一個地址部分蒲凶,但也可以使用路由字符串 converter patterns匹配位的網(wǎng)址溯乒,并使那些可用的本地變量。例如豹爹,我們可以創(chuàng)建一個新的控制器的方法裆悄,需要一點的網(wǎng)址和打印出來:
academy/controllers.py
'teachers': Teachers.search([])
})
@http.route('/academy/<name>/', auth='public', website=True)
def teacher(self, name):
return '<h1>{}</h1>'.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/ and http://localhost:8069/academy/Bob/ 看到差異。
正如名字所顯示的, converter patterns 不要只做提取臂聋,他們也 驗證 和 轉換光稼,所以我們可以改變新的控制器只接受整數(shù):
academy/controllers.py
'teachers': Teachers.search([])
})
@http.route('/academy/<int:id>/', auth='public', website=True)
def teacher(self, id):
return '<h1>{} ({})</h1>'.format(id, type(id).__name__)
# @http.route('/academy/academy/objects/', auth='public')
重啟Odoo, 訪問 http://localhost:8069/academy/2, 請注意,舊的值是字符串孩等,但新的一個被轉換為一個整數(shù)艾君。嘗試訪問 http://localhost:8069/academy/Carol/ 并注意到該頁并沒有找到:因為“Carol”是不是一個整數(shù),這條路線被忽略肄方,沒有找到路線冰垄。
Odoo提供了一個額外的轉換稱為 模型
提供記錄時直接給他們的ID。讓我們用這個來創(chuàng)建通用老師傳記的一頁:
academy/controllers.py
'teachers': Teachers.search([])
})
@http.route('/academy/<model("academy.teachers"):teacher>/', 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
</div>
</t>
</template>
<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>
<!-- <template id="object"> -->
<!-- <h1><t t-esc="object.display_name"/></h1> -->
<!-- <dl> -->
然后改變模型的列表权她,以連接到我們的新控制器:
academy/templates.xml
<div class="oe_structure">
<div class="container">
<t t-foreach="teachers" t-as="teacher">
<p><a t-attf-href="/academy/{{ slug(teacher) }}">
<t t-esc="teacher.name"/></a>
</p>
</t>
</div>
</div>
<div class="oe_structure"/>
<div class="oe_structure">
<div class="container">
<h3><t t-esc="person.name"/></h3>
</div>
</div>
<div class="oe_structure"/>
重啟Odoo升級模塊虹茶,那么你就可以訪問每個老師的網(wǎng)頁。作為一個練習隅要,試著在老師的頁面添加塊寫一篇傳記蝴罪,然后去另一個老師的網(wǎng)頁等等。你會發(fā)現(xiàn)步清,你的傳記之間的所有教師共享要门,因為塊添加到 模板虏肾,和 傳 模板之間的所有教師共享的,當一個網(wǎng)頁編輯欢搜,他們都在同一時間編輯封豪。
字段編輯
具體到記錄的數(shù)據(jù)應該保存在該記錄中,所以讓我們給我們的老師添加一個新的biography字段:
academy/models.py
_name = 'academy.teachers'
name = fields.Char()
biography = fields.Html()
academy/templates.xml
<div class="oe_structure">
<div class="container">
<h3><t t-esc="person.name"/></h3>
<div><t t-esc="person.biography"/></div>
</div>
</div>
<div class="oe_structure"/>
重啟Odoo和更新的觀點炒瘟,重新載入老師的網(wǎng)頁和…的領域是看不見的因為它不含有任何吹埠。
記錄字段模板可以使用一個特殊的 t-field
指令允許使用領域特定接口的網(wǎng)站編輯的字段內容。改變的 person 模板使用 t-field
:
academy/templates.xml
<div class="oe_structure"/>
<div class="oe_structure">
<div class="container">
<h3 t-field="person.name"/>
<div t-field="person.biography"/>
</div>
</div>
<div class="oe_structure"/>
重啟Odoo升級模塊唧领,現(xiàn)在有一個占位符的老師的名字,在 側塊新區(qū)域雌续。含量下降有存放在相應的教師 biography
領域斩个,進而具體教師。
老師的名字是可編輯的驯杜,當保存更改索引頁上可見受啥。
t-field
也可以采取的精確字段的格式選項。例如鸽心,如果我們顯示教師的記錄的修改日期:
academy/templates.xml
<div class="oe_structure">
<div class="container">
<h3 t-field="person.name"/>
<p>Last modified: <i t-field="person.write_date"/></p>
<div t-field="person.biography"/>
</div>
</div>
這是一個“電腦”的使用方式和難讀出來滚局,但我們可以問一個人類可讀的版本:
academy/templates.xml
<div class="oe_structure">
<div class="container">
<h3 t-field="person.name"/>
<p>Last modified: <i t-field="person.write_date" t-field-options='{"format": "long"}'/></p>
<div t-field="person.biography"/>
</div>
</div>
或相對顯示:
academy/templates.xml
<div class="oe_structure">
<div class="container">
<h3 t-field="person.name"/>
<p>Last modified: <i t-field="person.write_date" t-field-options='{"widget": "relative"}'/></p>
<div t-field="person.biography"/>
</div>
</div>
管理和企業(yè)管理系統(tǒng)集成
一個簡單的和不完全的Odoo管理導論
Odoo管理作了簡要的出現(xiàn)在 website support 剖面。我們可以回到它使用 管理員?管理員 菜單中(或 登錄 如果你簽出)顽频。
Odoo后端的概念結構簡單:
- 首先是菜單藤肢,一棵樹(菜單可以有子菜單)的記錄。沒有兒童地圖菜單…
- 行動糯景。行動有多種類型:鏈接嘁圈、報道,代碼Odoo應執(zhí)行或數(shù)據(jù)顯示蟀淮。數(shù)據(jù)顯示的行動被稱為 窗的 動作 最住,并告訴Odoo顯示給定 模型 根據(jù)一組視圖…
- 一個視圖有一個類型,一個廣泛的領域怠惶,它對應(列表涨缚、圖表、日歷)和 架構 策治,定做的模型是在視圖的顯示方式脓魏。
在Odoo管理編輯
默認情況下,一個Odoo模型是用戶基本上看不見的通惫。為了使其可見轧拄,它必須通過一個行動,它本身需要是可到達的讽膏,一般通過菜單檩电。
讓我們?yōu)槲覀兊哪P蛣?chuàng)建一個菜單:
academy/openerp.py
'data': [
'security/ir.model.access.csv',
'templates.xml',
'views.xml',
],
# only loaded in demonstration mode
'demo': [
academy/views.xml
<openerp>
<data>
<record id="action_academy_teachers" model="ir.actions.act_window">
<field name="name">Academy teachers</field>
<field name="res_model">academy.teachers</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"/>
訪問 http://localhost:8069/web/ 在左上方應該是一個菜單 學院,這是默認選中的,因為它是第一個菜單俐末,并且打開上市的教師料按。從上市有可能創(chuàng)造新 老師記錄,并通過記錄視圖切換到“窗體”卓箫。
如果沒有定義如何呈現(xiàn)記錄 (a view) Odoo將自動創(chuàng)建一個基本的飛行载矿。在我們的情況下,它的“列表”視圖(只顯示現(xiàn)在的老師的名字)但在“表”視圖的HTML biography
場并排顯示的 名字
領域并沒有給予足夠的空間烹卒。讓我們來定義一個自定義表單視圖來查看和編輯老師記錄一個更好的體驗:
academy/views.xml
<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"
關系模型
我們已經(jīng)看到了一對 "basic" 直接存儲在該記錄中的字段闷盔。有 一些基本字段. 第二類字段 relational 和用于鏈接到另一個(在一個模型或跨模型)的記錄。
示范旅急,讓我們創(chuàng)建一個 課程 模型逢勾。每門課程都應該有一個 老師
領域,鏈接到一個單一的老師的記錄藐吮,但每一個老師可以教很多課程:
academy/models.py
name = fields.Char()
biography = fields.Html()
class Courses(models.Model):
_name = 'academy.courses'
name = fields.Char()
teacher_id = fields.Many2one('academy.teachers', string="Teacher")
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
access_academy_courses,access_academy_courses,model_academy_courses,,1,0,0,0
讓我們也添加視圖溺拱,這樣我們就可以看到和編輯一個課程的老師:
academy/views.xml
</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"
還應該有可能直接從教師的網(wǎng)頁中創(chuàng)建新的課程,或者看到他們教的所有課程谣辞,所以增加 the inverse relationship
到 教師 模型:
academy/models.py
name = fields.Char()
biography = fields.Html()
course_ids = fields.One2many('academy.courses', 'teacher_id', string="Courses")
class Courses(models.Model):
_name = 'academy.courses'
academy/views.xml
<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>
討論與通知
Odoo提供技術的模式迫摔,不直接滿足業(yè)務需要而增加的能力,業(yè)務對象泥从,而不必手動建立句占。
其中之一是 Chatter 系統(tǒng),Odoo的電子郵件和通訊系統(tǒng)躯嫉,可以添加通知和討論線程模型辖众。該模型簡單地 _inherit
mail.thread
, 并添加 message_ids
字段以其窗體視圖顯示討論線程。討論線程是記錄的和敬。
對于我們的研究院凹炸,有意義的討論課程,以處理如調度變化或教師和助理之間的討論:
academy/models.py
class Courses(models.Model):
_name = 'academy.courses'
_inherit = 'mail.thread'
name = fields.Char()
teacher_id = fields.Many2one('academy.teachers', string="Teacher")
academy/views.xml
<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>
</field>
在每個課程形態(tài)的底部昼弟,現(xiàn)在有一個討論帖為系統(tǒng)留言啤它,跟隨或不跟隨鏈接到特定的用戶討論課程的可能性。
銷售課程
Odoo還提供商業(yè)模式允許使用或選擇在業(yè)務需求更直接舱痘。比如說 website_sale
模塊建立了一個基于產(chǎn)品在Odoo系統(tǒng)電子商務網(wǎng)站变骡。我們可以很容易地通過我們的課程課程訂閱特定種類的產(chǎn)品銷售。
而不是以前的經(jīng)典繼承芭逝,這意味著取代我們的 course 由 產(chǎn)品 模型塌碌,并在延伸產(chǎn)品(添加任何我們需要它)。
首先旬盯,我們需要添加一個依賴于 website_sale
所以我們得到這兩種產(chǎn)品 (通過 sale
) 和電子商務接口:
academy/openerp.py
'version': '0.1',
# 這一個需要正確工作的模塊
'depends': ['website_sale'],
# 總是加載
'data': [
重啟Odoo台妆,更新你的模塊翎猛,現(xiàn)在有一個 店 部分網(wǎng)站,列出了一些預填充(通過實證數(shù)據(jù))的產(chǎn)品接剩。
第二步是替換 courses 模型通過 product.template
, 為課程添加一個新的產(chǎn)品類別:
academy/openerp.py
'security/ir.model.access.csv',
'templates.xml',
'views.xml',
'data.xml',
],
# 只有在示范模式
'demo': [
academy/data.xml
<openerp><data>
<record model="product.public.category" id="category_courses">
<field name="name">Courses</field>
<field name="parent_id" ref="website_sale.categ_others"/>
</record>
</data></openerp>
academy/demo.xml
<record id="vaughn" model="academy.teachers">
<field name="name">Lester Vaughn</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>
</data>
</openerp>
academy/models.py
name = fields.Char()
biography = fields.Html()
course_ids = fields.One2many('product.template', 'teacher_id', string="Courses")
class Courses(models.Model):
_inherit = 'product.template'
teacher_id = fields.Many2one('academy.teachers', string="Teacher")
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
academy/views.xml
</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"
這個安裝切厘,現(xiàn)在幾門課程在 店是可用的,盡管他們可能要找懊缺。
Note
- 在地方擴展模型, it's
inherited
不給它一個新的_name
-
product.template
已經(jīng)使用了討論系統(tǒng)疫稿,所以我們可以從我們的擴展模型中刪除它 - 我們創(chuàng)造了我們的課程, 發(fā)布 默認情況下可以看到無需登錄
改變現(xiàn)有識圖
到目前為止鹃两,我們已經(jīng)簡要地看到:
- 創(chuàng)建新的模型
- 創(chuàng)建新的視圖
- 創(chuàng)建新的記錄
- 變更已存在的模型
我們離開與現(xiàn)有的記錄和改變現(xiàn)有的意見遗座。我們會在 店 頁。
看來改變是通過創(chuàng)建 extension 視圖俊扳,并應用上的獨到的見解和改變它途蒋。這些更改視圖可以添加或刪除,而不修改原始的拣度,使它更容易嘗試的東西了碎绎,滾動的變化螃壤。
由于我們的課程是免費的抗果,沒有任何理由在店內展示他們的價格,所以我們將改變觀點奸晴,并隱藏價格冤馏,如果它是0。第一個任務是找出哪些視圖顯示的價格寄啼,這可以通過 定制?HTML編輯器 讓我們讀參與渲染一個頁面的各種模板逮光。通過幾個,“產(chǎn)品項目”看起來可能是罪魁禍首墩划。
改變視圖架構是在3個步驟中完成的:
- 創(chuàng)建新的視圖
- 擴展視圖修改設置的新觀點的
inherit_id
的修改視圖的外部標識 - 在該體系結構中涕刚,使用
XPath
標簽來選擇和改變從修改的視圖元素
academy/templates.xml
<div class="oe_structure"/>
</t>
</template>
<template id="product_item_hide_no_price" inherit_id="website_sale.products_item">
<xpath expr="http://div[hasclass('product_price')]/b" position="attributes">
<attribute name="t-if">product.price > 0</attribute>
</xpath>
</template>
<!-- <template id="object"> -->
<!-- <h1><t t-esc="object.display_name"/></h1> -->
<!-- <dl> -->
我們將改變的第二件事是制作欄可見默認產(chǎn)品類別: 定制?產(chǎn)品類別 讓你切換一個樹的產(chǎn)品類別(用于過濾的主要顯示)和關閉。
這是通過 customize_show
和 active
領域延伸擴展模板:模板(如我們剛剛創(chuàng)建的)可以 customize_show=True乙帮。這個選擇將顯示在 定制 菜單復選框杜漠,允許管理員來激活或禁用它們(容易地定制自己的網(wǎng)站頁面)。
我們只需要修改 產(chǎn)品類別 記錄并設置其默認 active="True":
academy/templates.xml
</xpath>
</template>
<record id="website_sale.products_categories" model="ir.ui.view">
<field name="active" eval="True"/>
</record>
<!-- <template id="object"> -->
<!-- <h1><t t-esc="object.display_name"/></h1> -->
<!-- <dl> -->
有了這個察净,當Academy 模塊被安裝驾茴,這個 產(chǎn)品分類 欄將自動被啟用時。