本文是 Odoo 9.0 官方教程第二篇 建立網站
查看英文原文:
https://www.odoo.com/documentation/9.0/howtos/website.html
以下內容為機器翻譯,半人工校對,僅供參考。
建立網站
警告
- 本指南假設 Python的基本知識
- 本指南假設 已安裝Odoo
創建一個基本模塊
在Odoo,任務是通過創建模塊。
模塊定制的Odoo設施的行為,通過添加新的行為或改變現有的(包括行為由其他模塊添加)。
Odoo的腳手架 can 設置一個基本模塊。很快開始簡單地調用:
$ ./odoo.py scaffold Academy my-modules
這將自動創建一個 my-modules
模塊目錄 和一個 academy
模塊. 如果您想要的話,該目錄可以是一個現有的模塊目錄,但該模塊名必須是唯一的目錄。
示范模塊
我們有一個“完成”模塊準備安裝。
雖然它沒有絕對沒有,我們可以安裝它:
- 啟動odoo服務器
~~~
$ ./odoo.py --addons-path addons,my-modules
~~~
- 打開 http://localhost:8069
- 創建一個新的數據庫,包括演示數據
- 去 設置?模塊?模塊
- 在右上角的刪除 Installed 過濾器然后搜索 academy
- 點擊 Academy 模塊的安裝按鈕
到瀏覽器
Controllers 解釋瀏覽器請求并發送數據。
添加一個簡單的控制器,并確保它是導入的 __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/, 你應該看到你的“頁面”出現:
[圖片上傳失敗...(image-232951-1614764647435)]
模板
在Python中生成HTML不總是水到渠成。
通常的解決方案是 templates, 偽文件的占位符和顯示邏輯。Odoo允許任何Python模板系統,但提供了自己 QWeb 模板系統集成了其他功能。
創建一個模板,確保模板文件被注冊到 __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和更新模塊的數據(安裝模板)去 設置?模塊?模塊之間的 ?點擊升級。
提示
另外,Odoo可以重新開始 和更新模塊在同一時間
:
$ odoo.py --addons-path addons,my-modules -d academy -u academy
打開 http://localhost:8069/academy/academy/ 現在應該導致:
在Odoo存儲數據
Odoo models map to database tables.
在上一節中我們只顯示一個列表的字符串輸入靜態的Python代碼。這不允許修改或持久存儲,所以我們現在將我們的數據移到數據庫中。
定義數據模型
定義一個教師模型,并確保它是從 __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
數據文件 (XML 或 CSV) 必須添加到模塊清單,Python文件 (模型或控制器) 不要,但必須從進口 __init__.py
(直接或間接)
Warning
管理員用戶繞過訪問控制,他們可以訪問所有的模型,即使無法獲得
示范數據
第二步是向系統中添加一些演示數據,這樣就可以很容易地測試它了。這是通過添加一個 demo
數據文件, 這必須從清單鏈接:
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
數據文件 可用于演示和非演示數據。演示數據只加載在“示范模式”,可用于流量測試和演示,非演示數據總是加載和用作初始系統設置。
在這種情況下,我們使用演示數據,因為該系統的實際用戶將要輸入或輸入自己的老師列表,這個列表僅用于測試。
訪問數據
最后一步是修改模型和模板來使用我們的演示數據:
- 從數據庫中讀取記錄,而不是靜態列表
- 因為
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/. 網頁應該略有不同:名稱應簡單地以一個數字(老師用的數據庫標識符)。
網站支持
Odoo束模塊致力于網站建設。
到目前為止,我們已經使用的控制器相當直接,但Odoo 8添加更深層次的整合和一些其他的服務(例如,默認的樣式、主題)通過 網站
模塊。
- 首先, 請添加
website
作為一個依賴academy
- 然后加入
website=True
控制器上的標志,這設置了一些新的變量 請求對象 并允許使用網站布局在我們的模板 - 使用網站布局模板
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/ 應該得到一個更好的頁面與品牌和一些內置的頁面元素(頂級菜單,腳注,…)
網站的布局也提供了編輯工具支持:在 標志點擊 (前右),填寫證書 (admin
/ admin
默認) 然后點擊 登錄.
你現在在Odoo“適當的”:管理界面。現在點擊 網站 菜單(左上角。
我們回到網站,但作為管理員,獲得高級版的功能 website 提供支持:
- 模板代碼編輯器(自定義?HTML編輯器),您可以查看和編輯用于當前頁的所有模板
- 的 編輯 按鈕在左上角切換到“編輯模式”在蓋帽(片段)和富文本版是可用的
- 其他一些功能如移動預覽或 SEO
網址和路由
控制器方法與 routes 通過 route()
設計師以路由串和一些屬性來定制其行為或安全。
我們已經看到了一個“文本”的路由字符串,它匹配的一個地址部分,但也可以使用路由字符串 converter patterns匹配位的網址,并使那些可用的本地變量。例如,我們可以創建一個新的控制器的方法,需要一點的網址和打印出來:
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 不要只做提取,他們也 驗證 和 轉換,所以我們可以改變新的控制器只接受整數:
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, 請注意,舊的值是字符串,但新的一個被轉換為一個整數。嘗試訪問 http://localhost:8069/academy/Carol/ 并注意到該頁并沒有找到:因為“Carol”是不是一個整數,這條路線被忽略,沒有找到路線。
Odoo提供了一個額外的轉換稱為 模型
提供記錄時直接給他們的ID。讓我們用這個來創建通用老師傳記的一頁:
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升級模塊,那么你就可以訪問每個老師的網頁。作為一個練習,試著在老師的頁面添加塊寫一篇傳記,然后去另一個老師的網頁等等。你會發現,你的傳記之間的所有教師共享,因為塊添加到 模板,和 傳 模板之間的所有教師共享的,當一個網頁編輯,他們都在同一時間編輯。
字段編輯
具體到記錄的數據應該保存在該記錄中,所以讓我們給我們的老師添加一個新的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和更新的觀點,重新載入老師的網頁和…的領域是看不見的因為它不含有任何。
記錄字段模板可以使用一個特殊的 t-field
指令允許使用領域特定接口的網站編輯的字段內容。改變的 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升級模塊,現在有一個占位符的老師的名字,在 側塊新區域。含量下降有存放在相應的教師 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>
管理和企業管理系統集成
一個簡單的和不完全的Odoo管理導論
Odoo管理作了簡要的出現在 website support 剖面。我們可以回到它使用 管理員?管理員 菜單中(或 登錄 如果你簽出)。
Odoo后端的概念結構簡單:
- 首先是菜單,一棵樹(菜單可以有子菜單)的記錄。沒有兒童地圖菜單…
- 行動。行動有多種類型:鏈接、報道,代碼Odoo應執行或數據顯示。數據顯示的行動被稱為 窗的 動作 ,并告訴Odoo顯示給定 模型 根據一組視圖…
- 一個視圖有一個類型,一個廣泛的領域,它對應(列表、圖表、日歷)和 架構 ,定做的模型是在視圖的顯示方式。
在Odoo管理編輯
默認情況下,一個Odoo模型是用戶基本上看不見的。為了使其可見,它必須通過一個行動,它本身需要是可到達的,一般通過菜單。
讓我們為我們的模型創建一個菜單:
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/ 在左上方應該是一個菜單 學院,這是默認選中的,因為它是第一個菜單,并且打開上市的教師。從上市有可能創造新 老師記錄,并通過記錄視圖切換到“窗體”。
如果沒有定義如何呈現記錄 (a view) Odoo將自動創建一個基本的飛行。在我們的情況下,它的“列表”視圖(只顯示現在的老師的名字)但在“表”視圖的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"
關系模型
我們已經看到了一對 "basic" 直接存儲在該記錄中的字段。有 一些基本字段. 第二類字段 relational 和用于鏈接到另一個(在一個模型或跨模型)的記錄。
示范,讓我們創建一個 課程 模型。每門課程都應該有一個 老師
領域,鏈接到一個單一的老師的記錄,但每一個老師可以教很多課程:
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"
還應該有可能直接從教師的網頁中創建新的課程,或者看到他們教的所有課程,所以增加 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提供技術的模式,不直接滿足業務需要而增加的能力,業務對象,而不必手動建立。
其中之一是 Chatter 系統,Odoo的電子郵件和通訊系統,可以添加通知和討論線程模型。該模型簡單地 _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>
在每個課程形態的底部,現在有一個討論帖為系統留言,跟隨或不跟隨鏈接到特定的用戶討論課程的可能性。
銷售課程
Odoo還提供商業模式允許使用或選擇在業務需求更直接。比如說 website_sale
模塊建立了一個基于產品在Odoo系統電子商務網站。我們可以很容易地通過我們的課程課程訂閱特定種類的產品銷售。
而不是以前的經典繼承,這意味著取代我們的 course 由 產品 模型,并在延伸產品(添加任何我們需要它)。
首先,我們需要添加一個依賴于 website_sale
所以我們得到這兩種產品 (通過 sale
) 和電子商務接口:
academy/openerp.py
'version': '0.1',
# 這一個需要正確工作的模塊
'depends': ['website_sale'],
# 總是加載
'data': [
重啟Odoo,更新你的模塊,現在有一個 店 部分網站,列出了一些預填充(通過實證數據)的產品。
第二步是替換 courses 模型通過 product.template
, 為課程添加一個新的產品類別:
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"
這個安裝,現在幾門課程在 店是可用的,盡管他們可能要找。
Note
- 在地方擴展模型, it's
inherited
不給它一個新的_name
-
product.template
已經使用了討論系統,所以我們可以從我們的擴展模型中刪除它 - 我們創造了我們的課程, 發布 默認情況下可以看到無需登錄
改變現有識圖
到目前為止,我們已經簡要地看到:
- 創建新的模型
- 創建新的視圖
- 創建新的記錄
- 變更已存在的模型
我們離開與現有的記錄和改變現有的意見。我們會在 店 頁。
看來改變是通過創建 extension 視圖,并應用上的獨到的見解和改變它。這些更改視圖可以添加或刪除,而不修改原始的,使它更容易嘗試的東西了,滾動的變化。
由于我們的課程是免費的,沒有任何理由在店內展示他們的價格,所以我們將改變觀點,并隱藏價格,如果它是0。第一個任務是找出哪些視圖顯示的價格,這可以通過 定制?HTML編輯器 讓我們讀參與渲染一個頁面的各種模板。通過幾個,“產品項目”看起來可能是罪魁禍首。
改變視圖架構是在3個步驟中完成的:
- 創建新的視圖
- 擴展視圖修改設置的新觀點的
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> -->
我們將改變的第二件事是制作欄可見默認產品類別: 定制?產品類別 讓你切換一個樹的產品類別(用于過濾的主要顯示)和關閉。
這是通過 customize_show
和 active
領域延伸擴展模板:模板(如我們剛剛創建的)可以 customize_show=True。這個選擇將顯示在 定制 菜單復選框,允許管理員來激活或禁用它們(容易地定制自己的網站頁面)。
我們只需要修改 產品類別 記錄并設置其默認 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 模塊被安裝,這個 產品分類 欄將自動被啟用時。