美文网首页
构建一个网站

构建一个网站

作者: 22790fe4fb44 | 来源:发表于2018-06-26 20:36 被阅读0次

创建一个基本模块

在 Odoo,我们通过创建模块来完成任务。

使用 Odoo 的搭建脚本工具可以创建一个基本模块。

$ ./odoo-bin scaffold Academy my-modules

安装演示模块

在创建了 academy 模块后,即使它什么也没做,我们也可以安装这个模块。启动 Odoo 服务,

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

然后在应用中去掉过滤器,搜索 academy 就可以安装。

和浏览器交互

Controllers 处理浏览器的请求,返回结果。

from odoo import http

class Academy(http.Controller):
    @http.route('/academy/academy/', auth='public')
    def index(self, **kw):
        return "Hello, world"

在浏览器中打开 http://localhost:8069/academy/academy/ , 你会看到如下的页面

image.png

http的路由路径可以随意定义,不一定要以模块名,这里是 academy 开始。我们建议以模块名开始避免冲突。

我们看到 @http.route , 这是 Python 的 decorator 的语法。http://www.cnblogs.com/Jerry-Chou/archive/2012/05/23/python-decorator-explain.html

使用模板

手动拼装 html 不是一件让人愉快的事情。

在 Odoo 中,我们使用 QWeb(https://www.odoo.com/documentation/11.0/reference/qweb.html#reference-qweb) 作为模板语言(你也可以使用其他基于 Python 的模板语言)。

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"],
        })

这里将使用在 manifest.py 中注册的 academy.index 模板。

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>

你需要重新更新模块,在启动的时候可以使用更新选项:

$ odoo-bin --addons-path addons,my-modules -d academy -u academy

在浏览器中打开会看到如下的页面

basic-list.png

数据存储

首先定义好模型的类,

academy/models.py

from odoo import models, fields, api

class Teachers(models.Model):
    _name = 'academy.teachers'

    name = fields.Char()

设置相关的访问权限

academy/manifest.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

演示数据

可以用 XML 描述用于演示的静态数据

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>

这些数据会在演示模式下加载,在启动的时候会看到如下输出:

2018-06-26 12:07:29,908 20692 INFO phone580 odoo.modules.registry: module academy: creating or updating database tables
2018-06-26 12:07:29,997 20692 INFO phone580 odoo.modules.loading: loading academy/security/ir.model.access.csv
2018-06-26 12:07:30,030 20692 INFO phone580 odoo.modules.loading: loading academy/views/views.xml
2018-06-26 12:07:30,033 20692 INFO phone580 odoo.modules.loading: loading academy/views/templates.xml
2018-06-26 12:07:30,057 20692 INFO phone580 odoo.modules.loading: loading academy/demo/demo.xml

通过 PostgreSQL 客户端在 Tables 下可以观察到关联的数据

image.png image.png

当我们修改静态数据之后,需要更新模块才能生效,使用 -u 参数在启动的时候更新模块,要同时使用 -d 参数才能生效。

访问数据

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

我们看到很关键的地方在 Teachers = http.request.env['academy.teachers'] 这里将Teacher这个类引进了代码的上下文之中。

至此,我们看到了一个基本的渲染框架,以及一个简单的ORM框架,这些是构建一个网站的两个基本组成。

网站支持

odoo提供了一系列的模块帮助我们建立网站。目前为止,我们使用controllers的方式很直接,odoo通过website模块增加了更深度的整合以及包括样式、主体的服务。

  1. 增加website作为依赖;

  2. 然后在 controller 设置website=True标志,这样我们可以通过the request object获取更多变量,也可以在模板里使用website的layout;

  3. 使用website的layout。

URLs和路由

用来做路由的字符串可以使用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)
image.png

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__)
image.png

你可以使用model来根据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
    })

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>

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>

这样就可以在列表中跳转到具体的记录

image.png image.png

注意到slug函数用于提取记录的id。

字段编辑

模型之间的关系

除了基本的字段之外,我们也可以用关系字段来表示模型之间的关系。

相关文章

  • 构建一个网站

    创建一个基本模块 在 Odoo,我们通过创建模块来完成任务。 使用 Odoo 的搭建脚本工具可以创建一个基本模块。...

  • Java学习阶段七【大型高并发网站优化】

    ​​​如何构建一个高性能网站详解: 什么样的网站需要高性能,高性能的指标体系,构建高性能网站需要做哪些工作,注意哪...

  • gulp

    1 gulp(自动化构建工具) 自动化构建 自动化构建:优化网站,提升网站性能,提高网站的代码,文件的优化处理 处...

  • 网站构建

    网站由来 最初做网站是因为刚毕业有很多知识学了怕忘记,需要实践记录一下。后来回家看到我妈在找视频的时候说搜索不方便...

  • odoo网站构建器视频上传模块发布啦!

    odoo网站构建器视频上传模块发布啦! odoo的网站构建器是一个强大的功能,用户能够不写代码就能拖拽出一个响应式...

  • html基础第一天

    【网站定义】 什么是网站? 网站就是由多个网页联系在一起构建出来的一个整体; 什么网页? 网页就是由文字,图片和超...

  • SpringBoot

    1 功能 构建项目项目构建网站: https://start.spring.io/[https://start.s...

  • python web实践思路整理

    目标:构建一个基于网络爬取信息的网站 使用框架:Django 网站模块划分:1.信息检索;2.个人中心 相关技术:...

  • gorose orm+dotweb框架快速构建go web网站实

    gorose orm+dotweb框架快速构建go web网站实战

  • Jump Start Bootstrap 中文版 第5章

    第5章 深入了解:自定义Bootstrap 想象一下,一个网站,所有的网站都是用Bootstrap构建的,看起来和...

网友评论

      本文标题:构建一个网站

      本文链接:https://www.haomeiwen.com/subject/hituyftx.html