声明:

本教程基于 Ruter 老师的 [Odoo基础教程系列] ,Ruter老师教程的链接地址为:Odoo基础教程系列   。

本章内容总结

  • 1.项目前置准备
  • 2.创建模块,模块的简单配置
  • 3.model模型及模块安装
  • 4.创建菜单视图
  • 5.添加应用到应用列表
  • 6.创建任务列表视图。

项目初始准备

如果你的odoo环境还没有配合好的话,请参考我的另一篇文章:win10中odoo12环境配置

在配好环境之后,如果要启动项目,需要添加如下配置:

1.将odoo-bin文件放在odoo源码下,如果没有odoo-bin文件,可以将odoo源码下的一个odoo.py文件复制并更名为odoo-bin;

2.在 odoo源码/setup/odoo.conf中添加odoo配置,内容如下:

3.pycharm下项目启动配置,在绿色倒三角形旁边

4.在odoo源码的目录下创建一个myaddons文件夹,用来存放自己编写的odoo应用/模块,这里我的odoo源码是从gitee上下载的odoo12源码;

为了让odoo可以检索到我们自定义myaddons下的模块,我们要将myaddons的路径加入到模块检索路径下

在 odoo.conf 文件下添加如下配置:

addons_path=E:\YifChanSoft\Odoo\OdooSave\odoo_gitee\odoo\addons,E:\YifChanSoft\Odoo\OdooSave\odoo_gitee\myaddons

前一个是系统模块的路径,后面一个是我们自定义模块文件夹的路径

Todo应用

创建模块

在配置好环境之后,win10下执行以下命令可以创建一个应用

python odoo-bin scaffold todo myaddons

以上命令代表,在myaddons目录下创建一个名为todo的模块。

目录如下:

创建好todo模块后,我们在 __mainfest__.py 编写模块的清单文件:

__mainfest__.py

{
'name': "todo", # 应用/模块名
'summary': """todo task""", # 对应用/模块的摘要
'description': """Todo task-list the things you need to do.""", # 对应用/模块的描述
'author': "YifChan", # 作者
'application': True, # 将模块变成一个应用,可以在应用中搜索到
'sequence': 1, # 将应用/模块排在所有应用/模块的第一位
}

model模型及模块安装

在我们的todo应用中,todo任务模型要有 “待办任务”和“已完成”两个字段,

因此,我们在models/models.py中加入如下代码:

models/models.py

from odoo import models, fields, api

class TodoTask(models.Model):
_name = 'todo.task'
_description = '待办事项' name = fields.Char('描述', required=True)
is_done = fields.Boolean('已完成?')

在models/__inti__.py中添加如下代码:

from . import models

此时我们的项目已经可以在应用中被找到了

打开浏览器进入 http://127.0.0.1:8069 ,如果你是第一次进入的话,可能需要进行如下配置

其中各个的含义如下:

  • master password:数据库中超级管理员的密码
  • database name:将为你现在odoo源码创建的pg数据库
  • email:odoo管理员,可以不是邮箱,名字任取
  • password:odoo管理员密码

填写进入后,我们点击页面左上角的田字形符号,选择参数设置,点击右边的 激活开发者模式,截图如下:

不要纠结我左上角的todo,这是因为我已经装好并配置好了,原来只有todo下面的两列。

激活开发者模式之后,我们继续点击田字形符号里的应用,然后点击导航条上的刷新本地模块列表

这样我们就可以在右上角的搜索框中搜索todo了,如果是模块的话,记得叉掉应用后再查找模块名,这里因为我们已经配置了todo为应用,所以可以直接查找,查找结果如下:

点击安装,然后会刷新,但是刷新后你会发现还是回到了应用页面,并且再次搜索todo后,会显示已安装。

我们还不能进入todo应用页面,这是因为我们还没有给todo添加应用入口,下面我们来进行添加。

创建菜单

在views文件夹下,我们创建一个 views/todo_menus.xml 文件,并添加如下内容

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- 主菜单定义 -->
<menuitem id="menu_todo" name="Todo"/>
<!-- 菜单动作定义 -->
<record id="action_todo_task" model="ir.actions.act_window">
<field name="name">待办事项</field>
<field name="res_model">todo.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="target">current</field>
</record>
<!-- 子菜单定义 -->
<menuitem action="action_todo_task" id="submenu_todo_task" name="待办事项"
parent="menu_todo" sequence="10"/>
</data>
</odoo>

将todo_menus.xml文件添加入data列表中:

__mainfest__.py

'data': [
'views/views.xml',
'views/templates.xml',
'views/todo_menus.xml',
],

搜索模块,点击模块右上角的三点,进行升级模块。

注意事项

  • 在odoo中,如果你修改了xml文件,你所做的修改要升级应用后才能生效;
  • 如果你修改了py文件,要重启项目并且升级应用后才能使修改生效;但是我个人习惯,只要修改了,就重启项目并且升级应用。
  • 当你添加一个xml视图文件或者权限文件后,要将文件放入应用下的__mainfest__.py文件的data列表中。
  • 当你新建了一个python相关的文件夹,要在项目下的__init__.py文件中引入文件夹;
  • 当你在应用下的某个文件夹中新建了一个要自动初始化的py文件,要在该文件夹中的__init__.py文件中引入你所添加的py文件。

以上几点很重要,故在此统一列出,在后面可能不会再赘述,请读者牢记。

添加应用到应用列表

到了上一步其实我们还是不能观察到变化,这是因为我们还没有添加应用到应用列表中,即左上角的田字形列表中,先展示一下效果图:

为了实现这个,我们要确保一下三点:

  • 1,有model模型,
  • 2,在model模型的基础上,menu.xml中有具体子菜单项及动作
  • 3,在csv权限中有查看model的权限并将csv文件添加到data列表中

前面我们已经实现了model模型,和菜单xml,接下来我们实现第三点,

我们给security/ir.model.access.csv文件中添加如下内容:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_todo_task,todo.task,model_todo_task,,1,1,1,1

这里是给todo.task模型赋予增删改查的权限。

做完这个我们还要将这个文件添加到data列表中,其实只要解开该文件的注释即可,如下:

'data': [
'security/ir.model.access.csv',
],

重启项目,升级模块。

至此,我们可以点击左上角的下拉菜单并可以点击todo应用来进入应用,我们可以看到如下内容:

你可以点击创建一个任务看看。

创建任务列表视图

通过上一步我们已经可以看到任务列表了,这个是系统为我们自动配置的视图。

但是我们只能看到任务的name字段,而无法直接看见任务是否完成,此时,我们可以配置自己的视图来按照自己的需求来显示任务列表。

创建 views/todo_views.xml,并在其中加入如下内容

<odoo>
<data>
<!-- 待办事项列表显示视图 -->
<record id="todo_task_view_tree" model="ir.ui.view">
<field name="name">todo.task.view_tree</field>
<field name="model">todo.task</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Todo">
<field name="name"/>
<field name="is_done"/>
</tree>
</field>
</record>
</data>
</odoo>

将todo_view.xml加入data列表中。

升级应用后我们可以看到如下内容:

本节内容基本到此结束了。

代码汇总

todo/models/models.py

from odoo import models, fields, api

class TodoTask(models.Model):
_name = 'todo.task'
_description = '待办事项' name = fields.Char('描述', required=True)
is_done = fields.Boolean('已完成?')

todo/models/models.py

todo/security/ir.model.access.csv

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_todo_task,todo.task,model_todo_task,,1,1,1,1

todo/views/todo_menus.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- 主菜单定义 -->
<menuitem id="menu_todo" name="Todo"/>
<!-- 菜单动作定义 -->
<record id="action_todo_task" model="ir.actions.act_window">
<field name="name">待办事项</field>
<field name="res_model">todo.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="target">current</field>
</record>
<!-- 子菜单定义 -->
<menuitem action="action_todo_task" id="submenu_todo_task" name="待办事项"
parent="menu_todo" sequence="10"/>
</data>
</odoo>

todo/views/todo_menus.xml

todo/views/todo_views.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- 配置 待办事项列表 显示视图 -->
<record id="todo_task_view_tree" model="ir.ui.view">
<field name="name">todo.task.view_tree</field>
<field name="model">todo.task</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Todo">
<field name="name"/>
<field name="is_done"/>
</tree>
</field>
</record>
</data>
</odoo>

todo/views/todo_views.xml

todo/__mainfest__.py

{
'name': "todo", 'summary': """
todo task""", 'description': """
Todo task-list the things you need to do.
""", 'author': "YifChan",
'website': "http://www.yourcompany.com", # Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/12.0/odoo/addons/base/data/ir_module_category_data.xml
# for the full list
'category': 'Uncategorized',
'version': '0.1', # any module necessary for this one to work correctly
'depends': ['base'], # always loaded
'data': [
'security/ir.model.access.csv',
'views/views.xml',
'views/templates.xml',
'views/todo_menus.xml',
'views/todo_views.xml',
],
# only loaded in demonstration mode
'demo': [
'demo/demo.xml',
],
'application': True,
'sequence': 1,
}

todo/__mainfest__.py

[Odoo12基础教程]之第一篇-创建Todo应用的更多相关文章

  1. MongoDB基础教程系列--第一篇 进入MongoDB世界

    1.什么是MongoDB MongoDB是跨平台的.一个基于分布式文件存储的数据库.由C++语言编写.用它创建的数据库具备性能高.可用性强.易于扩展等特点.MongoDB将数据存储为一个文档,数据结构 ...

  2. spring cloud 2.x版本 Spring Cloud Stream消息驱动组件基础教程(kafaka篇)

    本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka-ri ...

  3. Xamarin.FormsShell基础教程(2)创建Shell解决方案

    Xamarin.FormsShell基础教程(2)创建Shell解决方案 创建Shell解决方案 在开发Shell的应用程序时,首先需要创建一个Shell解决方案,其具体操作步骤如下: (1)在VS的 ...

  4. Matlab高级教程_第一篇:Matlab基础知识提炼_01

    第一篇:Matlab基础知识提炼: 这一篇主要用系统和提炼性的语言对Matlab基础知识进行总结,主要适用于有语言基础的学习者.尽量不讲废话. 第一部分:Matlab是什么? 1 Matlab是Mat ...

  5. x86软路由虚拟化openwrt-koolshare-mod-v2.33联通双拨IPV6教程(第一篇)

    本文分两篇发布,此为第一篇,第二篇:https://www.cnblogs.com/zlAurora/p/12433302.html   年前TB购置了一台软路由,对家里网络来了个大改造,实现了PPP ...

  6. 微信小程序教程(第一篇)

    目录 第一篇小程序概述 第二篇如何注册接入小程序及搭建开发环境 第三篇小程序的架构及实现机制,信道服务及会话管理 第四篇小程序开发基本框架及其限制与优化 第五篇小程序开发项目实例,测试及发布 .... ...

  7. [Odoo12基础教程]之第零篇-win中odoo12环境搭建

    所需材料 1.python3.7 2.pycharm社区版及以上 3.postgresSQL10 下载链接:https://www.enterprisedb.com/thank-you-downloa ...

  8. Matlab高级教程_第一篇:Matlab基础知识提炼_02

    第三节:变量 正如其他编程软件一样. 都是通过变量来传递和交换数据的,这是基础.按照<MATLAB基础知识提炼>这篇文章先介绍变量比较合适.编程语言不外乎包括两部分:数据和结构.应该先把数 ...

  9. Matlab高级教程_第一篇:Matlab基础知识提炼_04

    第八节:几大MATLAB的数据类型 8.1 数值型 8.2 字符和字符串 创建用' ' 8.3 函数句柄 8.4 结构体 创建用. 语法:struct('field', var1,'field2',' ...

随机推荐

  1. 小房子配置开发实例-IT资产管理(资产类管理)--开发设计过程

    小房子(Houselet)作为一个集开发和应用为一体的管理软件平台,通过数据库配置开发的方式来开发管理系统:目的在于辅助企业低成本快速建设管理系统.且系统为开放的,随时可以维护升级的,随企业管理的需要 ...

  2. swift 实现iOS手势密码、指纹密码、faceID

    本博客包含了如何实现iOS手势密码.指纹密码.faceID全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBTouchID,支持swift3. ...

  3. String 和StringBuffe StringBuilder 的区别

    1.可变性:String不可变(适用于做HashMap的键),StringBuffer和StringBuilder可变 2.性能角度:,String在new的时候,会在常量池中开辟空间,比较耗费内存, ...

  4. python基础-字典dict

    字典-dict 用途: 定义方法:通过{} 来存储数据,通过key:value (键值对)来存储数据,每个键值对通过逗号分隔.在键值对中,key 是不可变的数据类型,value 是任意数据类型 def ...

  5. Linux wget 批量下载

    需求:已知50个pdf的URL地址,需要批量下载,该怎么办呢? 方案一:使用wget自带的一个功能 -i 选项  从指定文件中读取下载地址,这样的好处是一直是这一个wget进程下载所有pdf,不会来回 ...

  6. 关于css里大于号(>)的用法

    之前用的css没涉及到这个问题,今天看到.知道大概用法,但不知道和普通的后代选择器有什么区别.到网上找了,其实w3c的css文档里有很详细明确的介绍(http://www.w3school.com.c ...

  7. Mybatis:配置解析

    配置解析  mybatis-config.xml(Mybatis核心配置文件)深深影响了Mybatis行为的设置和属性信息. 能配置的的内容 当然,并不是所有都是我们经常使用到的,下面选择经常使用的配 ...

  8. Java I/O系统学习系列五:Java序列化机制

    在Java的世界里,创建好对象之后,只要需要,对象是可以长驻内存,但是在程序终止时,所有对象还是会被销毁.这其实很合理,但是即使合理也不一定能满足所有场景,仍然存在着一些情况,需要能够在程序不运行的情 ...

  9. 考试T2修剪草坪

    传送门 这题的DP真是刷新了我的理解,竟然还要用队列优化.... #include<iostream> #include<cstdio> using namespace std ...

  10. 大数据之路day01_3--JAVA语言基础(1)

    从这里开始,正式进入正轨 1.关键字  2.main main是关键字吗? 不是,他只是一个标识符,只不过有点特殊,虚拟机可以识别. main(主函数)的作用 1:可以保证程序的独立运行 2:是程序的 ...