odoo10学习笔记十七:controller
2017-07-12 14:41
218 查看
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7155356.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
模版文件解析:
id为:template_index
模版内容:遍历 courses,并打印输出。
2:在manifest中注册视图模版
3:在controller文件夹下,新建controller.py
先在__init__.py导入controller,否则odoo找不到。
controller内容:
继承 http.Controller类定义控制器;
通过 @http.route(url,auth=)控制请求映射,以及访问权限(公开 or 需要登陆)
最后,通过 http.request.render('模块名.视图模板id',{'参数名'(与视图模版中遍历的参数一致):参数值}) 传参并渲染得到响应页面并返回。
4:启动odoo,安装/更新模块,然后通过 ip:8069/url 发起访问,即可到达响应页面。(url为上面定义控制器时的映射路径)
三:使用ORM为视图文件传递内容
继承自models.Model而定义的类默认具有了odoo的ORM接口,也就是说,该类的所有实例对象都会自动保存到数据库中。
根据这个特性,我们可以这样往视图模版传递数据:
定义一个数据模型;
在odoo中创建该数据模型的一系列纪录(一条记录一个实例对象);
在视图文件中,遍历、使用对象,通过 对象.字段名 调用纪录的具体字段内容;
最后,在控制器中,使用环境上下文,查找该数据模型的所有纪录,然后传参即可。
在视图文件中遍历对象,通过对象.字段名调用数据:
在控制器中,先用环境上下文获取数据模型的所有纪录,得到一个纪录集。然后通过 纪录集.search()函数,返回一个纪录列表,传递给视图模板:
最后,更新模块,在模块中创建一些纪录,然后通过url访问,查看纪录集遍历结果。
一: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访问,查看纪录集遍历结果。
相关文章推荐
- odoo10学习笔记二:继承(扩展)、模块数据
- odoo10学习笔记五:高级视图
- angular学习笔记(三十)-指令(10)-require和controller
- Odoo10学习笔记三:模型(结构化的应用数据)、视图(用户界面设计)
- odoo10学习笔记六:工作流、安全机制、向导
- odoo10学习笔记1(Domain表达式)
- odoo10学习笔记九:Odoo10 API
- 【ASP.NET MVC 学习笔记】- 10 Controller和Action(1)
- odoo10学习笔记十:Actions
- odoo10学习笔记2(权限控制)
- odoo10学习笔记十六:定时任务
- odoo10学习笔记十四:mixin其他功能模块
- odoo10学习笔记八:qweb引擎
- odoo10学习笔记七:国际化、报表
- odoo10学习笔记四:onchange、唯一性约束
- Odoo10学习笔记一:入门与基础视图格式
- MonoRail学习笔记十七:TransformFilter的使用
- LPC2000系列学习笔记10--Bootloader
- 设计模式学习笔记十七——Iterator模式
- C#面向对象设计模式纵横谈 学习笔记10 Decorator 装饰(结构型模式)