(10)odoo控制器操作
-----------------
更新时间
11:17 2016-09-18 星期日 完善讲解
17:44 2016-02-17 星期三
-----------------
* 控制器Controller
它的功能是拦截浏览器的请求和响应数据的发送
* 一个简单的控制器
from openerp import http
class Mymodule(http.Controller)
@http.route('mymodule/mymodule/', auth='public')
def index(self,**kw)
return "Hello, world"
#return http.request.render("mymodule.index",{'fruits':['apple','banana','pear']})
使用模板
"mymodule.index":指mymodule模块下的标识为index的模板
{'fruits':['apple','banana','pear']}: 带一个字典数据给模板
对应的模板文件
<openerp>
<data>
<template id="index"> <!--定义了标识为index 的模板-->
<title>mymodule</title>
<t t-foreach="fruits" t-as="fruit"> <!--对带过的数据进行遍历-->
<p><t t-esc="fruit"></p>
</t>
</template>
</data>
</openerp>
* 数据模型
在开始安装模块时,会预定义一些数据
如模型定义如下:
from openerp import models,fields,api
class Fruits(models.Model):
_name = 'mymodule.fruits'
name = fields.Char()
manifest定义(__openerp__.py)如下:
'data':[
'security/ir.model.access.csv',
'fruits.xml'
],
security/ir.model.access.csv 内容如下:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_mymodule_fruits,access.mymodule.fruits,model__mymodule_fruits,,1,0,0,0
fruits.xml 内容如下:
<openerp>
<data>
<record id="apple" model="mymodule.fruits">
<field name="name">apple</field>
</record>
<record id="'banana" model="mymodule.fruits">
<field name="name">'banana</field>
</record>
<record id="pear" model="mymodule.fruits">
<field name="name">pear</field>
</record>
</data>
</openerp>
* 控制器得到数据模型定义的数据
from openerp import http
class Mymodule(http.Controller)
@http.route('mymodule/mymodule/', auth='public')
def index(self,**kw)
Fruits = http.request.env['mymodule.fruits'] #得到 mymodule.fruits 模型
return http.request.render("mymodule.index",{
'fruits':Fruits.search([]) # search([]) 全部搜索出来
})
* 路由 (URL Patterns)
# 带参数
@http.route('hello/<name>')
def hello(self,name, **kw){
return "Hello,{}".format(name)
}
#指定参数是整数
@http.route('hello/<int:identifier>')
def hello(self,identifier, **kw){
return "Hello,{}".format(identifier)
}
#指定参数是长度为5的字符串
@http.route('hello/<string(length=5):lang>')
def hello(self,lang, **kw){
return "Hello,{}".format(lang)
}
#指定参数是指定字符串数组之一
@http.route('hello/<any(bird,reptil,mammal):group>/<int:id>/')
def hello(self,group,,id, **kw){
return "Hello,{}".format(group,id)
}
* string(minlength=1,maxlength=None,length=None)
* path
* any(*items)
* int([fixed_digits][,min][,max])
* float([min],[,max])
* uuid(Werkzeug0.10)
* model(model_name)
#多重路径匹配
@http.route(['/hello/','/hello/<int:value>'])
def hello(self,value, **kw){
return "Hello,{}".format(value)
}
#网站支持
@http.route('/hello/', website=True)
def hello(self, **kw):
return http.request.render('module.hello')
--------
http.request.website
http.request.lang 得到语言
http.request.redirect(url) 跳转
* 验证
#公用,不要验证可以访问
@http.route('/hello/','public')
def hello(self, **kw){
# code
}
#要登录才能访问,否则跳到登录页面
@http.route('/hello/','user')
def hello(self, **kw){
# code
}
#request.uid=none
@http.route('/hello/','none')
def hello(self, **kw){
# code
}
# 采用 GET 模式访问
@http.route('/hello/', methods=['GET'])
def hello(self, **kw){
# code
}
# 采用 POST 模式访问
@http.route('/hello/', methods=['POST'])
def hello(self, **kw){
# code
}
* 请求
class openerp.http.WebRequest(httprequest)
封装的属性
httprequest: werkzeug.wrappers.Request 原始的request
params:映射的参数
env: 当前环境
context:上下文
session: 会话
cr: 数据库操作句柄
debug:当前是否调试模式
db:当前连接的数据库
class openerp.http.HttpRequest(*args)
make_response(data, headers=None, cookies=None)
not_found(description=None) 404页面的响应
render(template, qcontext=None, lazy=True, **kw) 带上模板渲染
class openerp.http.JsonRequest(*args)
返回json
* 响应
class openerp.http.Response(*args, **kw)
*args 为
template (basestring) -- 指定的模板名
qcontext (dict) -- 渲染的上下文
uid (int) -- 渲染到模板上的用户id
可用的方法
render() 渲染指定模板
flatten() 强制渲染,没有采用模板
* 控制器
class openerp.http.Controller
class MyController(openerp.http.Controller):
@route('/some_url', auth='public')
def handler(self):
return stuff()
覆盖:
class Extension(MyController):
@route()
def handler(self):
do_before()
return super(Extension, self).handler()
*代码分析
大部分操作用openerp/http.py中的方法
class Home(http.Controller):
#首页 跳转到/web
@http.route('/', type='http', auth="none")
def index(self, s_action=None, db=None, **kw):
return http.local_redirect('/web', query=request.params, keep_hash=True)
....
# 跳转
def local_redirect(path, query=None, keep_hash=False, forward_debug=True, code=303):
这是http.py中的,封装了 werkzeug的跳转
def redirect(location, code=302) 这个是werkzeug中的
#得到模型
request.registry['模型名']
menu_data = request.registry['ir.ui.menu'].load_menus(request.cr, request.uid, context=request.context)
(10)odoo控制器操作的更多相关文章
- ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由
原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...
- thinkphp使用模块/控制器/操作访问时出现No input file specified.解决方式
thinkphp使用 http://serverName/index.php/模块/控制器/操作 访问时,出现了 No input file specified. 的错误 解决办法: 一: 开启cgi ...
- threejs绕轴转,粒子系统,控制器操作等(二)
前言:threejs系列的第二篇文章,也是一边学习一边总结: 1,一个物体绕着另一个物体转动 上一篇文中主要是物体自转,为了描述一个一个物体绕另一个物体转,这里我描述了一个月球绕地球公转,并且自转的场 ...
- 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件
[源码下载] 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 创建文件夹,重命名文件夹,删除文件夹, ...
- Android:日常学习笔记(10)———使用LitePal操作数据库
Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...
- ThinkPHP3开发模式,控制器操作,配置文件,框架语法
ThinkPHP的开发模式 tp框架有两种使用模式:开发模式(调试模式),一种是生产模式(运行模式) define('APP_DEBUG', true); //调试模式 define('APP_DE ...
- (47) odoo详细操作手册
odoo 8 详细操作手册, ERP(Odoo8.0)操作手册-v1.10(陈伟明).pdf 链接: http://pan.baidu.com/s/1hsp0bVQ 密码: r9tt 花了将近9个月时 ...
- 动态单链表的传统存储方式和10种常见操作-C语言实现
顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. ...
- (04)odoo视图操作
-----------------更新时间19:04 2016-09-29 星期四11:17 2016-09-18 星期日18:13 2016-04-05 星期二15:05 2016-03-14 星期 ...
随机推荐
- 多线程&NSObject&NSThread&NSOperation&GCD
1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 2.NSOperation/NS ...
- MySql性能优化相关
原来使用MySql处理的数据量比较少,小打小闹的,没有关注过性能的问题.最近要处理的数据量飙升,每天至少20W行的新增数据,导致MySql在性能方面已经是差到不可用的地步了,必须要重视MySql的优化 ...
- C#借助谷歌翻译实现翻译小工具(一)基本功能实现
软件效果: 实现原理很简单,就是封装谷歌翻译网站:http://translate.google.cn/,一个WebBrowser"肢解"谷歌翻译网站的HtmlElement元素, ...
- ubuntu Linux 测试PHP却提示下载文件的解决办法
ubuntu Linux 测试PHP却提示下载文件的解决办法 一般这种情况都是在刚刚开始配置环境时出现的, 输入 sudo a2enmod php5 看提示如果出现“$ This module ...
- Populating Tabular Data Block Manually Using Cursor in Oracle Forms
Suppose you want to populate a non-database data block with records manually in Oracle forms. This t ...
- vsftp软链接ln遇到550错误
centos 6.3上新建了vsftp ,用于文件下载使用 ./var/ftp/pub可以匿名登陆下载 .如果想要上传则需要使用密码验证 . 登陆使用的账号是ftpclient ,路径在/home/f ...
- iOS案例:读取指定目录下的文件列表
// // main.m // 读取指定目录下的文件列表 // // Created by Apple on 15/11/24. // Copyright © 2015年 Apple. All rig ...
- FLASH CC 2015 CANVAS (二)html中写JS调用flash中的元件、函数、变量
注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 当你导出第一个canvas后,你会在保存fla的文件夹里 (每个项目默认位置)看到 如下文件,(请先 ...
- js 定时器的使用。 setInterval()
我需要实现的功能是:点击发送按钮,会出现 “已发送60s后可点击重发”,并且,60s 这个数字是随时变化的,60,59,58,57....0,然后再次返回到 发送 按钮. 类似效果,可参考 360首 ...
- 半平面交模板(O(n*n)&& O(n*log(n))
摘自http://blog.csdn.net/accry/article/details/6070621 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分 ...