问题来源
ODOO在Qweb中是可以使用JQuery的,所以可以通过前端异步请求后端方法来使用。
AJAX方法
既然可以使用JQuery,那就可以用$.ajax()方法来请求Controller里的方法,后端控制器的例子如下:
class Controller(http.Controller):
@http.route("/model/add",type='http',auth="public",website=True)
def add(self,**kw):
model= http.request.env['base.model']
text = '已添加成功'
try:
record = model.search([('no','=',kw.get('no'))])
if not record.exists():
model.sudo().create(kw)
else:
text = '数据库已存在该编号,请修改编号'
except Exception:
text = '有错误发生'
这里有注意的几个点:
- 需要http.route装饰器来指定访问路径
- http.request.env[]来拿到模型
- 模型的create方法来写入数据
然后就可以通过ajax来请求了。
ODOO自带的异步方法
其实ODOO还自带了请求方法,节省了写控制器的时间,大家可以理解为前端通过获取模型来调用后端模型里的方法,后端模型的例子如下:
@api.model
def model_add(self, **kwargs):
text = '已添加成功'
try:
if not self.search([('no','=',kwargs.get('no'))],limit=1).exists():
self.create(kwargs)
else:
text = '数据库已存在该编号,请修改编号'
except Exception:
text = '有错误发生'
return text
这里注意几点:
- 要注意新版api装饰器
- 直接使用self就可以操作模型了
前端方法:
var Model = require('web.Model');
...
var model = new Model("base.model");
model.call("model_add",{}).then(function(result) {
...
});
这里注意几点:
- 需要依赖于"web.Model"的js
- 通过call方法直接请求模型后端方法,第一个参数为方法名,第二个参数为要传入的参数
补充:ODOO11的修改
11.0后,已不存在web.Model模块,所以需要使用RPC,使用方法如下:
var rpc = require('web.rpc');
rpc.query({model: modelName, method: 'fields_get',args: [keys]}))
.then(function(data) {
// 代码
}):