罗列一些odoo开发中的简单但有效的方法;

1.重写odoo登录代码

参考链接:odoo10-重写登录方法

from odoo import models, fields, api, SUPERUSER_ID

class Users(models.Model):
_inherit = "res.users"
@classmethod
def _login(cls, db, login, password):
user_id = super(Users, cls)._login(db, login, password) """自定义代码部分开始"""
data = {
'user': user_id,
'message': u"用户登录了系统"
}
with cls.pool.cursor() as cr:
self = api.Environment(cr, SUPERUSER_ID, {})[cls._name]
self.env['system_log.login_log'].sudo().create(data)
"""自定义代码部分结束""" return user_id

2.使用jinja2在odoo中返回自定义的html页面

返回一个login.html页面

def get_env(self):
if hasattr(sys, 'frozen'):
# When running on compiled windows binary, we don't have access to package loader.
path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'views'))
loader = jinja2.FileSystemLoader(path)
else:
loader = jinja2.PackageLoader('odoo.addons.module_name', "views")
env = jinja2.Environment(loader=loader, autoescape=True)
return env env = self.get_env()
return env.get_template('login.html').render({"request": request, "errmsg": ""})

3.在controller中操作别的/指定数据库的数据

在odoo.register()中指定数据库

import odoo
import odoo.modules.registry registry = odoo.registry(request.session.db)
with registry.cursor() as cr:
env = api.Environment(cr, SUPERUSER_ID, {})
rec = env["res.users"].search([('login', '=', request.params['login'])])

4.自定义记录表示标题_rec_name

记录显示标题可采用一个魔法计算字段display_name,odoo会⾃动添加它到所有模型 中。它的值由name_get() 模型⽅法⽣成,name_get()的默认实现使⽤_rec_name属性来查找放置数据的字段,使⽤它⽣成显示名称。 如果你想要⾃⼰实现显示名称,可以重载name_get()中的逻辑来⽣成⼀个⾃定义显示名称。 该⽅法应返回⼀个包含两个元素的列表,格式:[(id,  unicode_str)]。

例如:

class LibraryBook(models.Model):
_name = "library.book"
_rec_name = "short_name" name = fields.Char(string="Title", required=True)
short_name = fields.Char(string="Short Name", required=True)
date_release = fields.Date(string="Release Date") def name_get(self):
result = []
for rec in self:
rec_name = "{}_{}".format(rec.name, rec.date_release)
data = (rec.id, rec_name)
result.append(data)
return result

5.模型父子级索引优化

我们启动了对于等级的特别⽀持。这是⼀个⾮常有⽤的⾼读取低写⼊指令,因为 它通过更⼤的写⼊运算开销带来了更快速的数据浏览。这通过添加⼀个帮助字段parent_path 及设置模型属性为 _parent_store=True来实现。在启⽤了这个属性之后,该帮助字段会⽤于 在等级树的搜索中存储数据。默认,它假定记录的⽗级字段名为parent_id,但也可以使⽤不 同的名称。这种情况下,正确的字段名应使⽤额外的模型属性_parent_name来进⾏表明。

class BookCategory(models.Model):
_name = "library.book.category"
# 添加如下代码启动特别的等级支持
_parent_store = True
_parent_name = "parent_id"
parent_path = fields.Char(index=True) name = fields.Char(string="Category")
parent_id = fields.Many2one("library.book.category", string="Parent Category", ondelete="restrict", index=True)
child_ids = fields.One2many("library.book.category", "parent_id", string="child Category")

详情可以查看anlan hou的 odoo12开发者指南第五章-应用模型;

6.计算字段的可编辑和可搜索

计算字段是在 运⾏时动态计算的,并且除⾮你⾃⼰特别的添加⽀持,否则它们是不可写、不可搜索的。 计算字段在运⾏时动态计算,但ORM使⽤缓存来避免在每次访问值时的低效重计算。
因此, 它需要知道所依赖的其它字段。它使⽤@depends装饰器来监测缓存值何时应置为⽆效并重 新计算。

确保compute函数总是为计算字段设置⼀个值。否则会抛出错误。这在代码中包含if条件⽽ 对计算字段设置值失败时会发⽣。那样会很难进⾏调试。

准备

date_release = fields.Date(string="Release Date")
# 计算字段,及让计算字段可编辑和可搜索
age_days = fields.Float(string="Days Since Release", compute="_compute_age", inverse="_inverse_age",
search="_search_age", store=False, compute_sudo=False) # 值计算逻辑的方法
@api.depends("date_release")
def _compute_age(self):
today = fields.Date.today()
for book in self.filtered("date_release"): # 筛选有 date_release 的书籍
delta = today - book.date_release
book.age_days = delta.days

计算字段逆向编辑

写操作可通过实现inverse函数来添加。这使⽤分配给计算字段的值来更新原字段。
# 添加方法及实现客入计算字段的逻辑
def _inverse_age(self):
today = fields.Date.today()
for book in self.filtered("date_release"): # 筛选有 date_release 的书籍
d = today - timedelta(days=book.age_days)
book.date_release = d

计算字段可搜素

可以通过将search属性设置为⽅法名(类似compute和inverse)来让⾮存储的计算字段可 搜索。这个⽅法预期不实现实际的搜索。⽽是接收⽤于搜索该字段的运算符和值来作为参 数,并预期返回⼀个带有⽤于替换搜索条件的域。

# 实现允许你在计算字段中进行搜索的逻辑;将对计算字段 age_days 的搜索转换为对 age_days 依赖的 date_release 字段的搜索
def _search_age(self, operator, value): # =, 7
today = fields.Date.today() # 2021,1,18
value_days = timedelta(days=value)
value_date = today - value_days
operator_map = {
'>': '<', '>=': '<=',
'<': '>', '<=': '>=',
}
new_op = operator_map.get(operator, operator) # =
res = [('date_release', new_op, value_date)] # [('date_release', '=', datetime.date(2021, 1, 11))]
return res

7.使用mail模块记录字段改变

在__manifest__.py中继承 mail 模块

'depends': ['base', 'mail'],

在需要记录的模型中继承mail的相关模型

_inherit = ['mail.thread', 'mail.activity.mixin']

在需要记录的字段后面添加追踪属性 track_visibility

title = fields.Char(string="标题", required=True, readonly=True, states={'draft': [('readonly', False)]}, track_visibility="onchange")

在模型的form视图上添加记录的字段

<sheet>
...
</sheet>
<div class="oe_chatter">
<field name="message_ids" widget="mail_thread"/>
</div>

8.用户自定义引用的模型及记录(使用引用字段添加动态关联)

在n2n中,我们可以固定提供用户选用的某条记录 ,比如用户要选择书籍中的红楼梦那条记录。但是有时候这不足以满足我们的需求,此时,我们可以让用户自己选择想要关联的模型及记录。我们通过引用字段来实现。

@api.model  # 在模型级别而不是记录集级别上进行操作
def _referencable_models(self):
models = self.env['ir.model'].search([])
return [(x.model, x.name) for x in models] ref_doc_id = fields.Reference(selection='_referencable_models', string="Reference Document")

9.使用可配置精度的浮点字段

odoo自带Decimal Precision configuration模块插件提供了这一功能。

步骤:安装模块,在配置中添加Usage,然后在模型字段中使用它。

1.搜索Decimal应用,点击安装;

2.激活开发者模式;进入设置--技术--数据库结构--小数准确性;创建一条记录,设置Usage为Book Price并选择数字精度,例如:

用途:Book Price
数字:3 # 表示小数位

3.在__manifest__.py声明文件中添加这个新依赖。如下:

"depends": ['base', 'decimal_precision'],  # 该模块所直接依赖的模块技术名称列表 # 第二个为可配置浮点数精度模块

4.使用数字精度设置添加模型字段

from addons import decimal_precision as dp
cost_price = fields.Float(string="Book Cost", digits=dp.get_precision('Book Price'))

显示结果:

Book Cost:99.000

运行原理:

get_precision()函数查找数字精度中的Usage字段并返回一个16位精度的元组以及在配置中所定义的小数位数。

待。。。

odoo之技巧合集一的更多相关文章

  1. Android中的对话框AlertDialog使用技巧合集-转载

    Android中的对话框AlertDialog使用技巧合集     文章来自:http://blog.csdn.net/blue6626/article/details/6641105   今天我用自 ...

  2. AS技巧合集「编码技巧篇」

    转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=254725&extra=page%3D2%26filter%3Dautho ...

  3. AS技巧合集「常用技巧篇」

    转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=254723&extra=page%3D2%26filter%3Dautho ...

  4. 电脑技巧合集 - imsoft.cnblogs

    ● 如何制作网页● 教你建一个别人打不开的文件夹 ● 只改一个值!马上加快宽带上网速度 ● 在电脑右下角显示你的名字● XP系统如何加快开机速度● 连接宽带时出错表示的意思 ● 恢复丢失数据的方法● ...

  5. AS技巧合集「调试技巧篇」

    转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=254726&extra=page%3D2%26filter%3Dautho ...

  6. 技巧&注意事项合集

    技巧&注意事项合集 杂项 OI Wiki有很多实用的东西 编程环境 打开Dev-C++中工具-编译选项-代码生成/优化-代码警告-显示最多警告信息的开关,可以检查出一堆傻逼错误 define ...

  7. 不容错过的UI设计素材大合集

    免费PSD素材 TETHR by InVision 这是出自InVision的8款PSD文件,其中包含了100个模板和超过500个UI控件.来自InVision和UI8的设计师一同协作完成了这套UI ...

  8. 大量Javascript/JQuery学习教程电子书合集

    [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人   不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pd ...

  9. JavaScript推荐资料合集(前端必看)

    这份合集覆盖了所有的JavaScript基本知识,从基本网络编程技巧,如变量.函数和循环语句,到高级一些的专题,如表单验证.DOM操作.客户端对象.脚本程序调试.学习前端的你不容错过! 资料名称 下载 ...

随机推荐

  1. xss未看完的文章

    https://blog.csdn.net/fen0707/article/details/8596888                XSS介绍与攻击 http://xss.fbisb.com/w ...

  2. XCTF EasyHook

    无壳,使用IDA直接分析主函数 逻辑很简单,问题的关键是Hook,题目也是EasyHook, 会发现在生成文件后,文件内容是被加密后的,那就怀疑加密函数参与Hook 动态调试一步步来看,先进入4012 ...

  3. Mysql联合索引的最左前缀原则以及b+tree

    软件版本mysql5.7 根据官网的文档 https://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html 查询条件要符合最左原 ...

  4. Python爬虫:爬取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

  5. Excel 数据对比,窗口并列排序操作(xlw文件格式的由来)

    步骤1:打开Excel文件,输入一些数据 步骤2:点击视图,创建新窗口(这里就会创建一个和步骤1一抹一样的的表格,我们可以在任务栏上看到) 第三步:点击视图里面的全部重排按钮,在重拍窗口里面选择需要拍 ...

  6. 深入理解MySQL系列之锁

    按锁思想分类 悲观锁 优点:适合在写多读少的并发环境中使用,虽然无法维持非常高的性能,但是在乐观锁无法提更好的性能前提下,可以做到数据的安全性 缺点:加锁会增加系统开销,虽然能保证数据的安全,但数据处 ...

  7. WEB层知识点

    目录 Web 应用程序技术 HTTP 1.1 HTTP请求 1.2 HTTP响应 1.3 HTTP方法 1.4 URL 1.5 HTTP消息头 1.常用消息头 2.请求消息头 3.响应消息头 1.7 ...

  8. 记一次诡异的debug

    idea debug的时候会开启一个线程之行 toString,所以我们一般不要在toString 做什么操作. 目前在读spring解析自定义标签的源. 解析过程中在XmlBeanDefinitio ...

  9. ESP8288-01S/ESP8288-01使用经验总结

    如图:ESP8288-01S/ESP8288-01的区别 超链接 ESP8288-01S/ESP8288-01是乐鑫公司推出的Wi-Fi模块,因为价格便宜迅速占领了市场,它可以做AT指令开发,也可以做 ...

  10. .Net Core — 依赖注入

    在.NET Core 中 依赖注入Dependency-Injection)作为基础知识,在.Net Core中无处不在:这么重要的知识接下来就了解和在.Net Core中使用. 一.依赖注入 说到依 ...