zoukankan      html  css  js  c++  java
  • odoo10学习笔记十七:controller

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189391.html 

    一:controller简述

    odoo里面的controller相似于springMVC,也是根据url来控制请求,把请求处理映射到具体某个方法上的。

    类比于springmvc中,根据请求,在请求处理方法中处理数据,然后控制view页面跳转。

    在odoo中的controller也是类似的工作原理:

    在view层,新建xml文件,定义视图模版;

    然后在controller目录下,新建controller类,在其中,定义请求处理方法,在方法上方通过 @http:route('url',auth='public/user') 控制请求映射;

    在方法中,处理数据,然后通过 http.request.render('模块名.视图模版id',视图模版所需参数列表......) 把参数传递给视图模板并渲染出页面,然后返回客户端作响应。

    二:一个简单的课程列表展示

    1:首先,新建一个视图模板文件

    views/template.xml

    复制代码
    复制代码
    <odoo>
        <data>
            <template id="template_index">
                <t t-foreach="courses" t-as="course">
                    <p><t t-esc="course"/></p>
                </t>
            </template>
        </data>
    </odoo>
    复制代码
    复制代码

    模版文件解析:

    id为:template_index

    模版内容:遍历 courses,并打印输出。

    2:在manifest中注册视图模版

      'data': [
            'views/template.xml',
        ],

    3:在controller文件夹下,新建controller.py

    先在__init__.py导入controller,否则odoo找不到

    复制代码
    复制代码
    # -*- coding: utf-8 -*-
    from odoo import http
    class Controller(http.Controller):
        @http.route("/open/courses/",auth="public")
        def index(self,**kw):
            return http.request.render("模块名.template_index",{'courses':['odoo','python','bootstarp']})
    复制代码
    复制代码

    controller内容:

    继承 http.Controller类定义控制器;

    通过 @http.route(url,auth=)控制请求映射,以及访问权限(公开 or 需要登陆)

    最后,通过 http.request.render('模块名.视图模板id',{'参数名'(与视图模版中遍历的参数一致):参数值})  传参并渲染得到响应页面并返回。

    4:启动odoo,安装/更新模块,然后通过  ip:8069/url  发起访问,即可到达响应页面。(url为上面定义控制器时的映射路径)

    三:使用ORM为视图文件传递内容

    继承自models.Model而定义的类默认具有了odoo的ORM接口,也就是说,该类的所有实例对象都会自动保存到数据库中。

    根据这个特性,我们可以这样往视图模版传递数据:

    定义一个数据模型;

    在odoo中创建该数据模型的一系列纪录(一条记录一个实例对象);

    在视图文件中,遍历、使用对象,通过  对象.字段名  调用纪录的具体字段内容;

    最后,在控制器中,使用环境上下文,查找该数据模型的所有纪录,然后传参即可。

    在视图文件中遍历对象,通过对象.字段名调用数据:

                <t t-foreach="courses" t-as="course">
                <p><t t-esc="course.id"/></p>    <p><t t-esc="course.name"/></p>
                </t>

    在控制器中,先用环境上下文获取数据模型的所有纪录,得到一个纪录集。然后通过 纪录集.search()函数,返回一个纪录列表,传递给视图模板:

        def index(self,**kw):
           #通过环境上下文获取数据模型的所有纪录
            courses=http.request.env['openacademy.course']
           #纪录集.search(),返回纪录列表传递给视图模版进行渲染
            return http.request.render("openacademy.template_index",{'courses':courses.search([])})

    最后,更新模块,在模块中创建一些纪录,然后通过url访问,查看纪录集遍历结果。

  • 相关阅读:
    word批量打印工具,c#写的
    word添加页眉脚和设置各页不同的页眉页脚.
    打印机双面打印
    ORACLE OCP认证
    基于.net程序,使用cefsharp开发的打开网页工具,如何不加载图片
    在iis上运行的服务器端程序,运行一段时间后,访问都只出现一行乱码,回收进程池后又好了,求大神回复
    ArcGis API for JavaScript 开发笔记一 加载地图
    修改现有消息类让.net core项目支持Protobuf
    结合现有分布式系统的数据一致性思考
    让现有vue前端项目快速支持多语言
  • 原文地址:https://www.cnblogs.com/ygj0930/p/11189391.html
Copyright © 2011-2022 走看看