转载请注明原文地址: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访问,查看纪录集遍历结果。

最新文章

  1. 论Segmentation fault
  2. jQuery设置和获取以及修改class name值操作
  3. iOS边练边学--多线程练习的多图片下载 以及 使用第三方框架(SDWebImage)的多图片下载
  4. matches field ID value 17.9.1 The LABEL element
  5. sql server 向oracle导入表
  6. ipv4、ipv6的socket同时监听“bind: Address already in use”的解决方法
  7. idea git merge代码
  8. Java设计模式之《单例模式》及应用场景
  9. Scala 简介
  10. verilog学习笔记(4)_有限状态机
  11. hdu 1166 线段树(sum+单点修改)
  12. clisp, scheme 和 clojure 初学习
  13. 聊聊分布式开发 Spring Cloud
  14. Docker 启动,进入容器,查看log命令
  15. php 更改PHP临时文件的目录
  16. (Solved) Nexiq USB link&#160;with CAT ET: connection error 149
  17. python学习日记(生成器函数进阶)
  18. php中foreach()跳出循环或者终止循环的实现方法
  19. pycharm中conda环境部署
  20. 评点SAP HR功能及人力资源管理软件

热门文章

  1. 【转】java爬虫,爬取当当网数据
  2. LG2495 「SDOI2011」消耗战 虚树
  3. 提高python运行效率-pypy
  4. CF-1238 C.Standard Free2play
  5. SQLi_Labs通关文档
  6. Springboot使用ehcache缓存
  7. 针对.NET Core, Xamarin以及.NET的自动类型安全Rest库: Refit
  8. 扩展centos7.4虚拟机磁盘大小
  9. jQuery 源码解析(六) $.each和$.map的区别
  10. Logstash:把MySQL数据导入到Elasticsearch中