创建一个基本模块

在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/, 你应该看到你的“页面”出现:

模板

在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

数据文件 可用于演示和非演示数据。演示数据只加载在“示范模式”,可用于流量测试和演示,非演示数据总是加载和用作初始系统设置。

在这种情况下,我们使用演示数据,因为该系统的实际用户将要输入或输入自己的老师列表,这个列表仅用于测试。

访问数据

最后一步是修改模型和模板来使用我们的演示数据:

  1. 从数据库中读取记录,而不是静态列表
  2. 因为 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添加更深层次的整合和一些其他的服务(例如,默认的样式、主题)通过 网站 模块。

  1. 首先, 请添加 website 作为一个依赖 academy
  2. 然后加入 website=True 控制器上的标志,这设置了一些新的变量 请求对象 并允许使用网站布局在我们的模板
  3. 使用网站布局模板

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/ 应该得到一个更好的页面与品牌和一些内置的页面元素(顶级菜单,脚注,…)

在Odoo9.0建立网站教程

网站的布局也提供了编辑工具支持:在 标志点击 (前右),填写证书 (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/ andhttp://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后端的概念结构简单:

  1. 首先是菜单,一棵树(菜单可以有子菜单)的记录。没有儿童地图菜单…
  2. 行动。行动有多种类型:链接、报道,代码Odoo应执行或数据显示。数据显示的行动被称为 窗的 动作 ,并告诉Odoo显示给定 模型 根据一组视图…
  3. 一个视图有一个类型,一个广泛的领域,它对应(列表、图表、日历)和 架构 ,定做的模型是在视图的显示方式。

在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个步骤中完成的:

  1. 创建新的视图
  2. 扩展视图修改设置的新观点的 inherit_id 的修改视图的外部标识
  3. 在该体系结构中,使用 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 > 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 模块被安装,这个 产品分类 栏将自动被启用时。