odoo模块创建

创建一个odoo模块

要创建一个odoo模块,我们首先要了解odoo模块基本的框架,每个odoo项目要包含哪几个文件和目录?
基本的逻辑是有两个必要的py文件:__ init__.py和__ manifest __.py
init是用来指定项目中你希望包含的python文件
manifest是模块的描述文件,介绍模块的重要属性

目录则可以包含以下几个内容:
models:用来放模型
views:用来放视图
data
security
controllers
demo
等等

首先是创建模型,其次是菜单和动作,最后是视图
在视图中,需要先定义菜单,menuitem,倒着写一个动作,再往上写form ,最上层写tree。系统扫描文件时先定义tree,再定义form.写完view文件后在manifest中data里补充上。
session.py在models中。session_views.xml则对应在views中
在views中,应该在xml中写清楚这个模块菜单的name和id,以及下一层的parent属性应该时上一层的id
manifest中应包含这几个内容:
name、version、category、description、website、author、depends、data、license
name:app可见名字
version:指定版本号
category:web
description:描述模块的用途和目的
author:作者
depends:告知框架这个模块正常运行所需要的基础
data:需要包含在模块中的xml中,如初始数据或者权限
demo:提供演示数据

模块是什么?
新增业务逻辑、修改已有的业务逻辑,odoo中一切都是围绕模块展开的
模块有什么?
包含元素:业务对象、数据文件(xml、csv)web控制器、静态web数据
模块结构
目录
文件
controller 处理浏览器请求
demo 演示数据、说明文档
init.py 初始文件
manifest.py 内部链接
models MVC中的模型,业务对象
security 存放csv文件
view 视图
.xml文件中需要写

<odoo>
<data>
<record id="" model="">record>
data>
odoo>

有odoo data record,在record中添加id model
注:每个record必有一个id

ORM

模型、字段(基本字段、保留字段、特殊字段)
data.xml
数据文件要生效
必须加载在manifest中添加 always load

尝试建立一个odoo自定义模块: Mljacademy学院
首先建立一个空的模块,包含以下目录和文件
1.models
2.security
3.view
4.__ init__.py
5.__ manifest__.py
对应odoo建立一个新模块的步骤
其中后续增加data模块
models中建__init__.py、models.py
security中建ir.model.access.csv
views中建views.xml

以下是具体代码的内容
·mljacademy/models/__ init __,py

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from . import models
# -*- coding: utf-8 -*-
from odoo import models,fields


class MljCourse(models.Model):
    _name = 'mlj.course'

    name = fields.Char(string="Title",required=True)
    description = fields.Test()

·mljacademy/views/views.xml
注:这部分非常重要,我在这里重复错误了很多次,一定要在view下写空的odoo、data嵌套

<odoo>
    <data>

    data>
odoo>

·mljacademy/__ init __.py

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from . import models


·mljacademy/__ manifest __.py

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
    'name':'MLJ学院',
    'summary':"""
        Short(1 phrase/line) summary of the module's purpose,used as 
        subtitle on modules listing or apps.openerp.com""",
    'description':"""
        Long description of module's purpose
        """,
    'author':'My Company',
    'website':'http://www.yourcompany.com',


    'category':'Uncategorized',
    'version':'0.1',

    'depends':['base'],

    'data':[
        'views/views.xml',
    ],
    'demo':[

    ],

}

·mljacademy/data/data.xml

<odoo>
    <data>
        <record  model="mlj.course" id="course_01">
            <field name="name">odoo开发field>
            <field name="description">odoo的官方开发模块field>
        record>

        <record  model="mlj.course" id="course_02">
            <field name="name">odoo应用field>
            <field name="description">odoo10应用field>
        record>
    data>
odoo>

然后在manifest中data:加上’data/data.xml’,
注:在这里我犯了一个错误,屡次发布报错,后寻找发现models下models.py中的models.Model的.打成,改正后发布正常。
此时在odoo外部标识中找到course_01和02

动作和菜单

动作的三种方式:菜单,视图中的按钮,对象中上下文
动作的快捷方式:ir.ui.menu
动作的定义要在菜单之上
当视图的类型是form时,mode可以是tree或者form
默认显示的是排在前的
开发者模式下的编辑动作就是我们要实现的
·mljacademy/views/views.xml

<odoo>
    <data>

     <record model="ir.actions.act_window" id="mljacademy.action_menu_kecheng">
         <field name="name">课程field>
         <field name="res_model">mlj.coursefield>
         <field name="view_type">formfield>
         <field name="view_mode">tree,formfield>
     record>






        <menuitem name="学院" id="mljacademy.menu_root"/>

        <menuitem name="教务" id="mljacademy.menu_jiaowu"     parent="mljacademy.menu_root"/>

        <menuitem name="课程" id="mljacademy.menu_kecheng"    parent="mljacademy.menu_jiaowu"
                  action="mljacademy.action_menu_kecheng"/>

    data>
odoo>

到这步,菜单和动作就完成了

基础视图

tree

·mljacademy/views/view.xml
追加
这里写一个search视图,用来搜索
如果没有定义生成视图,odoo会自动生成一个search为name的字段


     <record id="view_mlj_course_filter" model="ir.ui.view">
         <field name="name">view.mlj.course.filterfield>
         <field name="model">mlj.coursefield>
         <field name="arch" type="xml">
             <search string="课程">
                 <field name="name" string="课程名称"/>
                 <field name="description" string="描述"/>
             search>
         field>
     record>




    <record model="ir.ui.view" id="view_mlj_course_list">
        <field name="name">view.mlj.course.listfield>
        <field name="model">mlj.coursefield>
        <field name="arch" type="xml">
            <tree>
                <field name="name"/>
                <field name="description"/>
            tree>
        field>
    record>

form

创建和编辑一条记录
sheet 分成左右两页 左边是titile 右边是description
·mljacademy/views/view.xml
追加

		<record id="view_mlj_course_form" model="ir.ui.view">
            <field name="name">view.mlj.course.formfield>
            <field name="model">mlj.coursefield>
            <field name="arch" type="xml">
                <form string="课程">
                    <sheet>
                        <group>
                            <group>
                                <field name="name"/>
                            group>
                        group>
                        <group>
                        group>
                        <notebook>
                            <page string="信息">
                                <field name="description"/>
                            page>
                            <page string="关于">
                                这是关于。。。。
                            page>
                        notebook>
                    sheet>
                form>
            field>
        record>

session

一个模型的记录和另一个模型的记录要相连。例如:销售订单的记录关联到客户上
在课程模块里就是在特定的时间段内开哪些课
创建一个session模块
·在models中添加session

class MljSession(models.Model):
    _name = 'mlj.session'

    name = fields.Char(string="Session")
    start_date = fields.Date(string="开始时间")
    duration = fields.Float(digits=(6,2),help="Duration in days")
    seats = fields.Integer(string="座位数")

·views.xml中追加

        <record id="view_mlj_session_list" model="ir.ui.view">
            <field name="name">view.mlj.session.listfield>
            <field name="model">mlj.sessionfield>
            <field name="arch" type="xml">
                <tree>
                    <field name="name" />
                    <field name="start_date" />
                    <field name="seats" />
                tree>
            field>
        record>


        <record id="view_mlj_session_form" model="ir.ui.view">
            <field name="name">view.mlj.session.formfield>
            <field name="model">mlj.sessionfield>
            <field name="arch" type="xml">
                <form string="Session">
                    <sheet>
                        <group>
                            <group>
                                <field name="name"/>
                                <field name="start_date"/>
                                <field name="duration"/>
                                <field name="seats"/>
                            group>
                        group>
                    sheet>
                form>
            field>
        record>
        <record model="ir.actions.act_window" id="action_menu_session">
            <field name="name">Sessionsfield>
            <field name="res_model">mlj.sessionfield>
            <field name="view_mode">tree,formfield>
        record>

        <menuitem name="Session" id="mljacademy.menu_session"    parent="mljacademy.menu_jiaowu"
                  action="mljacademy.action_menu_session"
                  sequence="20"/>

M2O是一条记录
O2M是一个容器,多条记录
官方文档说明:要有O2M必有M2O,这个M2O在other_model上
M2M

笔记:
简单的基本开发步骤:
一共包括四个文件,俩文件。见上述
1.data 存储数据文件,以记录存储data.xml格式,odoo嵌套data 内容写record ,models用来写模型,存–init–.py文件。
2.models.py中要写明引用的模块models,fields定义新的类,写入-name=‘模块名‘ ,例如mlj.course
定义name=fields.Char(String="",required)
description = field.Text()
-init-.py中添加引用即可
3.views内存xml文件,对应models内容。xml格式是odoo data嵌套 其中三部分是菜单、动作、视图,依此从下网上写。
菜单:menuitem ,属性是name id parent
菜单的名字可以随意取,id要有菜单的意义
id= mlj.course_menu_root :这个是根菜单
子菜单在parent中写明父菜单的id
动作:record 记录。model、id是属性
model固定的格式是ir.actions.act_window
id是项目,动作的id是mljcourse.action_kecheng
field属性包括:name + 内容
res_model 项目_name
view_type form
view_mode tree,form
视图:record记录 model、id作为属性
包括tree、form
form、tree视图的model是ir.ui.view
field属性有name :view.项目名_name.form
model:项目_name
arch type:xml
form标签内写sheet 嵌套group和notebook

这里有一篇文章写的也很好

https://blog.csdn.net/qq_29654325/article/details/78017047

你可能感兴趣的:(odoo)