odoo路由器系列(Controllers)

你们好,javascript

今天,咱们来说讲odoo 中的 Controller(路由器),它的主要功能,是提供将web页面中的信息,进行路由。css

首先,咱们但愿获得的最终效果样式:一个网站页面,包含:公司、用户、联系人等等信息。前端

example_page_2

步骤1:建立路由器java

在你建立一个网页前,你须要作的第一步是建立一个路由器(Controller)。这个路由器,会告诉Odoo 某个URL的具体网页指向。打开您的模块,建立一个文件夹,将其命名为“Controllers”。python

在建立好后,新建一个_init_文件,并添加如下代码:jquery

# -*- coding: utf-8 -*- from . import example 

这样,你已经成功把example文件,引入odoo库
步骤1.1:建立路由器函数web

让咱们来建立第一个路由器,首先,咱们先看看下面的一段代码:数据库

# -*- coding: utf-8 -*- from odoo import http class Example(http.Controller): @http.route('/example', type='http', auth='public', website=True) def render_example_page(self): return http.request.render('create_webpage_demo.example_page', {}) @http.route('/example/detail', type='http', auth='public', website=True) def navigate_to_detail_page(self): # This will get all company details (in case of multicompany this are multiple records) companies = http.request.env['res.company'].sudo().search([]) return http.request.render('create_webpage_demo.detail_page', { # pass company details to the webpage in a variable 'companies': companies}) 

这段代码的含义是什么呐?后端

@http.route 会告诉odoo 咱们但愿连接 /example 至 一个指定页面。这个方法里,咱们看到了4个函数:浏览器

‘/example’: 这段代码用于定义,URL的网页指向

type=’http’:这段代码,用于说明网页运行于http协议。(其余协议:)

auth=’public’:告诉Odoo谁能够访问网页。(其余选项包含:’user’,’public’,’none’)

website=’True’:说明,此方法为网页

步骤1.2:告诉odoo页面位置

返回方法,告诉odoo哪一个位置来调用原始页面。

return http.request.render('create_webpage_demo.example_page', {}) 

这段代码,http.request.render 会调用odoo架构里的 渲染器。用来渲染出,相应的效果。这里的create_webpage_demo是咱们的模块名,example_page是咱们的文件名。
注意:方法里有个{},这个字典的主要用途是来进行传值,返回给网页。后面会进一步讲到。

步骤2:建立网页视图

在manifest.py文件中,建立视图文件,example_webpage.xml

而后,编辑文件: 【首先,让咱们看看代码】

<odoo>
  <data> <template id="example_page" name="Example page" page="True"> <t t-call="website.layout"> <div class="oe_structure"> <div class="container"> <center><h3>Title</h3></center> <p> You can add all your content here.<br/> <a t-attf-href="/example/detail" class="btn btn-info">Company detail page</a> </p> </div> </div> </t> </template> </odoo> 

代码一贯比较冗长,很难看懂。咱们一步一步来看。首先,咱们看到有个id = “example_page”。这是什么?这里就是咱们前面用路由器(Controllers)里面定义的页面。这样,odoo就能够知道,咱们须要它渲染的页面是当前咱们正在编辑的代码。

而后,咱们看到 page="True" 标签,这样odoo架构才能够知道须要将此xml渲染为网页,而不是单纯的数据返回。接下来:

 

这段代码,是由于前端界面是不少css 文件,jquery 文件等等组成,咱们的网页须要经过调用odoo原生的视图模板,并把当前xml文件中的值,填入原生视图模板中后,进行渲染出相应的网页。

这里的,

,就是用来带出相应的css、js、jquery等等文件。

步骤2.1:查看视图

如今,咱们就能够来看看,咱们写出来的代码最后是什么样子。

打开浏览器,进入 example 界面,你能够看到如图所示的网页。
example_web_page

步骤2.2:模块方法二

咱们如今为咱们的控制器,建立第二个方法。

让咱们看看如下代码:

@http.route('/example/detail', type='http', auth='public', website=True) def navigate_to_detail_page(self): # This will get all company details (in case of multicompany this are multiple records) companies = http.request.env['res.company'].sudo().search([]) return http.request.render('create_webpage_demo.detail_page', { # pass company details to the webpage in a variable 'companies': companies}) 

这段代码里,咱们把数据经过 字典{},传入网页前端。

步骤2.3:方法传值

咱们看到,由于没有任何代码用来传值,您也能够在路由器中读取数据库中的值。

一般状况下,咱们使用下面的方法在模型中调用数据库的值。
companies = self.env['res.company'].search([])
可是,在 路由器中,咱们是没法使用这个方法的。

必须使用,下面的方法进行数据库数据调用。
companies = http.request.env['res.company'].sudo().search([])
你们看到,咱们这里添加了 sudo() 方法,为何?由于,咱们但愿路由器中的方法,像管理员同样,能够随意调用数据库中的数据,同时不会遇到任何安全问题。
注意:这里,咱们将全部的公司数据都传入的前端。【{'companies': companies}】
**步骤3:详细视图
**
最后,咱们来建立咱们的详细视图。

<template id="detail_page" name="Detail page" page="True"> <t t-call="website.layout"> <div class="oe_structure"> <div class="container"> <center><h3>Company detail page</h3></center> <t t-foreach="companies" t-as="company"> <h4><span t-esc="company.name"/></h4> <table class="table-striped table"> <tr> <td>Phone:</td> <td><span t-esc="company.phone"/></td> </tr> <tr> <td>E-mail:</td> <td><span t-esc="company.email"/></td> </tr> <tr> <td>Address:</td> <td> <span t-esc="company.street"/> <span t-esc="company.street2"/><br/> <span t-esc="company.city"/> <span t-esc="company.country_id.name"/> </td> </tr> </table> </t> </div> </div> </t> </template> 

初看这段代码,一脸懵逼。首先,路由器经过 detail_page 定位到当前这个文件。

而后,咱们用了一段循环语句,t t-foreach 来将从后端返回的数据进行前端展现。

<t t-foreach="companies" t-as="company"> // 这就是循环,相似C 里面的Loop 

由于,这里使用了一个foreach语句,您能够访问一切公司数据。访问语法为:”company.field_name”

<h4><span t-esc="company.name"/></h4> 

步骤4:查看效果
最后,就生成了咱们但愿看到的网页。(访问: /example/detail)
example_web_page_3

相关文章
相关标签/搜索