在Odoo中,任務(wù)通過創(chuàng)建模塊來執(zhí)行。

模塊定制了Odoo安裝的行為,可通過添加新行為或者更改現(xiàn)有的行為來實(shí)現(xiàn)(包括通過其他模塊添加的行為)。

Odoo的scaffold可以" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > Odoo11.0官方開發(fā)文檔-教程-網(wǎng)站的構(gòu)建

Odoo11.0官方開發(fā)文檔-教程-網(wǎng)站的構(gòu)建

時間:2023-08-05 11:27:02 | 來源:網(wǎng)站運(yùn)營

時間:2023-08-05 11:27:02 來源:網(wǎng)站運(yùn)營

Odoo11.0官方開發(fā)文檔-教程-網(wǎng)站的構(gòu)建:創(chuàng)建一個基本模塊

在Odoo中,任務(wù)通過創(chuàng)建模塊來執(zhí)行。

模塊定制了Odoo安裝的行為,可通過添加新行為或者更改現(xiàn)有的行為來實(shí)現(xiàn)(包括通過其他模塊添加的行為)。

Odoo的scaffold可以創(chuàng)建一個基本的模塊,要快速開始只需簡單的調(diào)用:

$ ./odoo-bin scaffold Academy my-modules這樣會自動創(chuàng)建一個my-modules模塊目錄以及一個內(nèi)部的academy 模塊。該目錄可以是一個您希望的已存在的模塊目錄。但是模塊名稱在目錄中必須是唯一的。

演示模塊

我們有了一個“完整”的待安裝的模塊。

雖然里面什么都沒有,但是我們也可以安裝它:

$ ./odoo-bin --addons-path addons,my-modules

對于瀏覽器

控制器 解析瀏覽器請求并發(fā)回?cái)?shù)據(jù)。

添加一個簡單的控制器并確保它在__init__.py 中導(dǎo)入(以便Odoo可以識別):

academy/controllers.py

# -*- coding: utf-8 -*-from odoo import httpclass 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):停止您的服務(wù) (^C) 并重啟它:

$ ./odoo-bin --addons-path addons,my-modules打開頁面:http://localhost:8069/academy/academy/,您應(yīng)該看到網(wǎng)頁顯示:







模板

在Python中生成HTML并不十分友好。

通常的解決方案是使用模板,也就是包含占位符和顯示邏輯的偽文檔。Odoo允許任何Python模板系統(tǒng),但提供它自己的QWeb模板系統(tǒng),它可以和其他功能集成。

創(chuàng)建一個模板并確保它在__manifest__.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

<odoo> <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并轉(zhuǎn)到設(shè)置>模塊>模塊>Academy,點(diǎn)擊升級更新模塊的數(shù)據(jù)(安裝模板)。

另外,也可以重啟Odoo并同時更新模塊:

$ odoo-bin --addons-path addons,my-modules -d academy -u academy現(xiàn)在轉(zhuǎn)到http://localhost:8069/academy/academy/ 可以看到:







在Odoo中保存數(shù)據(jù)

Odoo模型映射到數(shù)據(jù)庫的表格中。

在前面一個章節(jié)中,我們剛剛顯示了在Python代碼中輸入的一個靜態(tài)列表。但這樣無法修改或者持久性的保存,因此我們現(xiàn)在把數(shù)據(jù)移到數(shù)據(jù)庫中。

定義數(shù)據(jù)模型

定義一個教員模型,并確保它從__init__.py 正確導(dǎo)入:

academy/models.py

from odoo import models, fields, apiclass Teachers(models.Model): _name = 'academy.teachers' name = fields.Char()然后為模型設(shè)置基本的訪問控制并把它們添加到清單文件:

academy/__manifest__.py

# always loaded 'data': [ 'security/ir.model.access.csv', 'templates.xml', ], # only loaded in demonstration modeacademy/security/ir.model.access.csv

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlinkaccess_academy_teachers,access_academy_teachers,model_academy_teachers,,1,0,0,0這樣就簡單的把讀取的權(quán)限 (perm_read) 開給了所有用戶(group_id:id 留空)。

數(shù)據(jù)文件(XML或者CSV)必須添加到模塊的清單文件中,而Python文件(models或者controllers)則需要在__init__.py 文件中導(dǎo)入(直接或者間接)

警告

管理員用戶會繞過訪問控制,它們擁有對所有模型的訪問權(quán),即時沒有分配相應(yīng)的訪問權(quán)限

演示數(shù)據(jù)

第二步是添加一些演示數(shù)據(jù)到系統(tǒng)中以方便測試。這可以通過添加演示數(shù)據(jù)文件來完成,它必須在清單文件中引用:

academy/demo.xml

<odoo> <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></odoo>數(shù)據(jù)文件可被用于演示和非演示數(shù)據(jù)。演示數(shù)據(jù)僅在“演示模式”中加載來用于流程測試和演示,非演示數(shù)據(jù)總是被加載并用于初始化系統(tǒng)設(shè)置。

這種情況下我們會使用演示數(shù)據(jù),因?yàn)橐粋€實(shí)際的系統(tǒng)用戶會希望輸入或者導(dǎo)入他們自己的教員列表,這個列表僅作為測試用途。

訪問數(shù)據(jù)

最后一步是修改模型和模板來使用我們的演示數(shù)據(jù):

  1. 從數(shù)據(jù)庫抓取數(shù)據(jù),而不是從一個靜態(tài)列表
  2. 因?yàn)?b>search() 方法會返回一個匹配篩選條件(在這里是“所有記錄”)的數(shù)據(jù)集,更改模板來打印每個教員的name
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"> -->重啟服務(wù)并更新模塊(目的是更新清單文件和模板并載入演示文件)然后瀏覽:http://localhost:8069/academy/academy/。頁面看起來會稍有不同:名稱會簡單的以數(shù)字作為前綴(教員在數(shù)據(jù)庫中的標(biāo)識)。

網(wǎng)站支持

Odoo打包了一個專用于構(gòu)建網(wǎng)站的模塊。

現(xiàn)在我們很直接的使用了控制器,但Odoo 8 通過website 模塊添加了更深度的集成和一些其他的服務(wù)(例如默認(rèn)風(fēng)格、主題)。

  1. 首先,添加website 作為academy 的依賴
  2. 然后在控制器中添加website=True 標(biāo)志,這樣會在請求對象上設(shè)置一些新的變量,并允許在我們的模板中使用website布局
  3. 在模板中使用website布局
academy/__manifest__.py

'version': '0.1', # any module necessary for this one to work correctly 'depends': ['website'], # always loaded 'data': [academy/controllers.py

from odoo import httpclass 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

<odoo> <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"> -->重啟服務(wù)并更新模塊(為了更新清單文件和模板),訪問http://localhost:8069/academy/academy/ 會得到一個更好看的頁面,帶有品牌和一些內(nèi)建的頁面元素(頂級菜單,頁腳……等等)







網(wǎng)站布局也為版本工具提供了支持:點(diǎn)擊右上角的登入,輸入憑據(jù)(默認(rèn)為admin/admin)然后點(diǎn)擊登錄。

您已正確的進(jìn)入了Odoo的管理界面?,F(xiàn)在點(diǎn)擊左上角的網(wǎng)站菜單。

我們以管理員身份再次回到網(wǎng)站前端,現(xiàn)在具有了website模塊提供的高級的功能:

URL和路由

控制器方法通過route()裝飾器與路由關(guān)聯(lián),它使用一個路由字符串和一組屬性來自定義行為或安全。

我們已經(jīng)見過了“文本型”的路由字符串,它精確的匹配一個URL區(qū)塊,但路由字符串也可以使用匹配URL字位并將變量轉(zhuǎn)換為本地變量的轉(zhuǎn)換器模式。例如,我們可以創(chuàng)建一個新的控制器方法,它使用一個URL字位并將它打印出來:

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/http://localhost:8069/academy/Bob/ 查看差異。

和名稱表示的一樣,轉(zhuǎn)換器模式不只是做抽取,它們也做驗(yàn)證轉(zhuǎn)換,因此我們可以把新控制器改為只接受整形參數(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,注意雖然舊值是一個字符串,但新的值已經(jīng)被轉(zhuǎn)換成一個整數(shù)。請?jiān)L問http://localhost:8069/academy/Carol/ 請注意該頁面是找不到的:因?yàn)椤癈arol”不是一個整形,路由被忽略,找不到對應(yīng)的值。

Odoo提供了一個額外的轉(zhuǎn)換器名為model,它在給定ID時直接提供記錄。讓我們利用這個來為教員的傳記(biography)創(chuàng)建一個常規(guī)的頁面:

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> -->然后修改模型列表來關(guān)聯(lián)到我們的新控制器:

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并升級模塊,然后您可以訪問到每個教員的頁面。作為練習(xí),添加一些區(qū)塊到教員的頁面來撰寫一個傳記,然后轉(zhuǎn)到另外一個教員的頁面做相同的操作。您會發(fā)現(xiàn),您的傳記在所有教員之間共享了,因?yàn)檫@些區(qū)塊被添加到了模板中,而傳記模板在所有教員中共享,因此其中一個頁面被編輯后,它們都同時被修改了。

字段編輯

指定記錄的數(shù)據(jù)應(yīng)該被保存在該記錄上,我們來添加一個傳記字段(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并更新視圖,刷新教員頁面……因?yàn)樽侄问强盏乃圆⒉豢梢姟?br>
對于記錄的字段,模板可以使用一個特殊的t-field 指示,它允許使用指定字段的界面從網(wǎng)站編輯字段內(nèi)容。修改模板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ū)域。該位置的內(nèi)容保存在教員相應(yīng)的字段biography中,和該教員對應(yīng)。

教員的名稱也是可編輯的,更改保存時在索引頁面可見。

t-field 也可以使用格式化的選項(xiàng),它依賴于確切的字段。例如,如果我們更改教員記錄的修改日期:

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>它以為非?!半娔X化”的方式顯示并難以閱讀,但我們可以請求一個人工可讀的版本:

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-options='{"format": "long"}'/></p> <div t-field="person.biography"/> </div></div>或者一個相關(guān)的顯示:

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-options='{"widget": "relative"}'/></p> <div t-field="person.biography"/> </div></div>

管理和ERP集成

一個Odoo管理的簡單和完整的介紹

Odoo管理的概要在網(wǎng)站支持 章節(jié)已經(jīng)介紹。我們可以使用菜單中的管理員>管理員返回(或者在注銷時使用登入)。

Odoo后臺的概念框架是很簡單的:

  1. 首先是菜單,一個記錄樹(菜單可包含子菜單)。沒有子項(xiàng)的菜單映射到……
  2. 動作。動作有多種類型:Odoo要執(zhí)行或者數(shù)據(jù)要顯示的鏈接,報表和代碼。數(shù)據(jù)顯示動作被稱為窗口動作,并告訴Odoo按一組視圖顯示一個給定的模型……
  3. 一個視圖包含類型、和一組它所對應(yīng)的類別(列表、圖表、日歷),和一個定義了視圖中模型的顯示方式的框架。

Odoo管理中的編輯

按默認(rèn),Odoo模型實(shí)質(zhì)上對于用戶是不可見的。必須通過動作使其可見,通常是通過菜單訪問。

我們來為模型創(chuàng)建一個菜單:

academy/__manifest__.py

'data': [ 'security/ir.model.access.csv', 'templates.xml', 'views.xml', ], # only loaded in demonstration mode 'demo': [academy/views.xml

<odoo> <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"/>然后在左上角菜單中的Academy菜單訪問http://localhost:8069/web/,它默認(rèn)作為第一個菜單被選中,打開一個教員的列表。從列表中可以創(chuàng)建一條教員的記錄,并通過記錄視圖切換到“表單”。

如果沒有如何顯示記錄(視圖)的定義,Odoo會自動實(shí)時創(chuàng)建一個基本的定義。在我們的案例中,它現(xiàn)在對于“列表”視圖可用(僅顯示教員的名稱),但“表單”視圖中HTML字段biography會在name字段旁邊顯示,并且沒有足夠的空間。讓我們定義一個自定義的表單視圖,來獲得更好的查看和編輯教員記錄的體驗(yàn):

academy/views.xml

<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"/>

模型之間的關(guān)系

我們已經(jīng)了解了直接保存在記錄中的一對“基本”的字段?;咀侄斡泻芏鄠€。第二種字段類別是關(guān)系型字段,用于關(guān)聯(lián)字段到另外一個字段(模型內(nèi)部或者跨模型)。

為了演示,我們來創(chuàng)建一個courses 模型。每個課程包含一個teacher字段,關(guān)聯(lián)到一個教員的記錄,但每個教員可以教授很多課程:

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_unlinkaccess_academy_teachers,access_academy_teachers,model_academy_teachers,,1,0,0,0access_academy_courses,access_academy_courses,model_academy_courses,,1,0,0,0讓我們也添加視圖以便查看和編輯課程的教員:

academy/views.xml

</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"/>從教員頁面直接創(chuàng)建新課程或者查看所有他們教授的課程也是可以的,可以添加反向關(guān)系到教員的模型中:

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

<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>

討論和通知

Odoo提供了一些技術(shù)模型,它不會直接實(shí)現(xiàn)業(yè)務(wù)需求,但它們向業(yè)務(wù)對象添加了功能而無需手工構(gòu)建。

這其中包括了聊天系統(tǒng),它是Odoo郵件和消息系統(tǒng)的一部分,它可以向任何模型添加通知和討論主題。該模型簡單的繼承(_inheritmail.thread 模型,并添加message_ids 字段到它的表單視圖來顯示討論主題。討論主題按每條記錄顯示。

對于我們的學(xué)院(academy)來說,它可以允許討論課程來處理例如計(jì)劃修改或者教員和助教之間的討論:

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

<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> </record>每個課程表單的底部,有一個討論主題和可能的系統(tǒng)用戶,來對關(guān)聯(lián)的特定課程進(jìn)行留言、關(guān)注或者取消關(guān)注。

銷售課程

Odoo也提供了業(yè)務(wù)模型,它允許更直接的使用和選擇加入業(yè)務(wù)。例如website_sale 模塊基于Odoo系統(tǒng)中的產(chǎn)品設(shè)置了一個電商網(wǎng)站。我們可以方便的通過指定類別的產(chǎn)品使得課程訂閱可銷售。

除了之前常規(guī)的繼承,它意味著可以通過product模型替換我們的course模型,并就地?cái)U(kuò)展產(chǎn)品(添加任何東西到產(chǎn)品中)。

首先我們需要為website_sale添加依賴,這樣我們可以同時獲得產(chǎn)品(通過銷售sale)和電商界面:

academy/__manifest__.py

'version': '0.1', # any module necessary for this one to work correctly 'depends': ['website_sale'], # always loaded 'data': [重啟Odoo,更新您的模塊,現(xiàn)在網(wǎng)站中有了一個商城板塊,列出了預(yù)設(shè)(通過演示數(shù)據(jù))的產(chǎn)品。

第二步是通過product.template替換 courses 模型,并為courses添加一個新的類別:

academy/__manifest__.py

'security/ir.model.access.csv', 'templates.xml', 'views.xml', 'data.xml', ], # only loaded in demonstration mode 'demo': [academy/data.xml

<odoo> <record model="product.public.category" id="category_courses"> <field name="name">Courses</field> <field name="parent_id" ref="website_sale.categ_others"/> </record></odoo>academy/demo.xml

<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></odoo>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_unlinkaccess_academy_teachers,access_academy_teachers,model_academy_teachers,,1,0,0,0academy/views.xml

</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"/>基于這個安裝,一些課程現(xiàn)在在商城中可用了,即使它們還需要進(jìn)行搜索。

更改現(xiàn)有的視圖

目前,我們已經(jīng)簡要的看了:

我們還要了解一下現(xiàn)有記錄和視圖的修改。我們將在商城頁面中修改它們。

視圖更改可以通過創(chuàng)建擴(kuò)展視圖來完成,它應(yīng)用在原始視圖上,并可以對原始視圖做修改。這些修改的視圖可以添加或者刪除,不需要修改原有的視圖,使得新元素的試用和恢更加方便。

因?yàn)槲覀兊恼n程是免費(fèi)的,不需要在商城頁面中顯示它們的價格,因此我們計(jì)劃修改視圖并隱藏價格為零的字段。第一個任務(wù)是找出顯示價格的視圖,這可以通過自定義>HTML編輯器,它可以讓我們讀取到頁面呈現(xiàn)相關(guān)的各種模板。查看這些模板,“產(chǎn)品項(xiàng)目”看起來是對應(yīng)的視圖。

更改視圖框架可以通過3個步驟完成:

  1. 創(chuàng)建一個新視圖
  2. 通過設(shè)置新視圖的inherit_id為要修改的視圖的外部ID,來擴(kuò)展要修改的視圖
  3. 在框架中,使用標(biāo)簽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="//div[hasclass('product_price')]/b" position="attributes"><attribute name="t-if">product.price &gt; 0</attribute> </xpath> </template> <!-- <template id="object"> --> <!-- <h1><t t-esc="object.display_name"/></h1> --> <!-- <dl> -->我們將更改第二件事情是使得產(chǎn)品分類的邊欄按默認(rèn)可見:自定義>產(chǎn)品分類,讓您可以切換產(chǎn)品分類樹的顯示和隱藏(用于過濾主顯示)。

這可以通過擴(kuò)展模板的customize_showactive 字段來實(shí)現(xiàn):擴(kuò)展的模板(例如我們剛創(chuàng)建的)可以設(shè)置customize_show=True。這個選項(xiàng)將在自定義菜單中顯示包含選擇框的視圖。使得管理員可以激活或者禁用它們(以及方便的自定義它們的網(wǎng)站頁面)。

我們只需要簡單的修改產(chǎn)品分類記錄并設(shè)置它默認(rè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> -->這樣,產(chǎn)品分類邊欄會在Academy模塊安裝時自動啟用。

關(guān)鍵詞:教程,官方,發(fā)文

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉