時間: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-bin scaffold Academy my-modules
這樣會自動創(chuàng)建一個my-modules模塊目錄以及一個內(nèi)部的academy 模塊。該目錄可以是一個您希望的已存在的模塊目錄。但是模塊名稱在目錄中必須是唯一的。$ ./odoo-bin --addons-path addons,my-modules
# -*- 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)頁顯示: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-bin --addons-path addons,my-modules -d academy -u academy
現(xiàn)在轉(zhuǎn)到http://localhost:8069/academy/academy/ 可以看到: from odoo import models, fields, apiclass Teachers(models.Model): _name = 'academy.teachers' name = fields.Char()
然后為模型設(shè)置基本的訪問控制并把它們添加到清單文件: # always loaded 'data': [ 'security/ir.model.access.csv', 'templates.xml', ], # only loaded in demonstration mode
academy/security/ir.model.access.csvid,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 留空)。<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è)置。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)識)。 'version': '0.1', # any module necessary for this one to work correctly 'depends': ['website'], # always loaded 'data': [
academy/controllers.pyfrom 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)建的頁面元素(頂級菜單,頁腳……等等) '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/ 查看差異。 '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)的值。 '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)到我們的新控制器: <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ū)塊被添加到了模板中,而傳記模板在所有教員中共享,因此其中一個頁面被編輯后,它們都同時被修改了。 _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> <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)。 <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化”的方式顯示并難以閱讀,但我們可以請求一個人工可讀的版本:<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)的顯示:<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>
'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)建一條教員的記錄,并通過記錄視圖切換到“表單”。 <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"/>
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.csvid,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
讓我們也添加視圖以便查看和編輯課程的教員: </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)系到教員的模型中: 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>
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)注。 '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)品。 '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.csvid,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
academy/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)行搜索。<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 > 0</attribute> </xpath> </template> <!-- <template id="object"> --> <!-- <h1><t t-esc="object.display_name"/></h1> --> <!-- <dl> -->
我們將更改第二件事情是使得產(chǎn)品分類的邊欄按默認(rèn)可見:自定義>產(chǎn)品分類,讓您可以切換產(chǎn)品分類樹的顯示和隱藏(用于過濾主顯示)。 </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ā)文
客戶&案例
營銷資訊
關(guān)于我們
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。