罗列一些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. asp.net webapi 给字段赋初始值DefaultValue 解决前端传空字符串后台接受不是“”而是NULL

    /// <summary> /// 存储ID /// </summary> public Guid SaveID { get; set; } /// <summary&g ...

  2. 魔改redis之添加命令hrandmember

    魔改redis之添加命令hrandmember 目录 魔改redis之添加命令hrandmember 正文 前言 Set类型与srandmember命令 Hash类型对比Set类型 hrandmemb ...

  3. mysql数据安全之利用二进制日志mysqlbinlog恢复数据

    mysql数据安全之利用二进制日志mysqlbinlog恢复数据 简介:如何利用二进制日志来恢复数据 查看二进制日志文件的内容报错: [root@xdclass-public log_bin]# my ...

  4. Echarts数据可视化,easyshu图表集成。

      介绍: ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Sa ...

  5. CTF:从0到1 -> zero2one

    本篇blog首发0xffff论坛(CTF:从0到1->zero2one - 0xFFFF),中间有各位大佬补充,搬到了个人博客CTF:从0到1 -> zero2one | c10udlnk ...

  6. stm32之定时器彻底研究

    分类: C/C++ 这里介绍两种方式使用stm32的定时器:直接操作寄存器和使用st的官方的库文件. 相比较而言,直接操作定时器比较简洁,对着寄存器看十分明了.而使用库文件有一点晕头转向. (个人观点 ...

  7. [php]配置文件中的超时时间

    概要 php.ini l  max_execution_time l  max_input_time php-fpm.conf l  process_control_timeout l  reques ...

  8. hashmap的简易实现,基本实现PUT GET

    p.p1 { margin: 0; font: 12px Menlo; color: rgba(79, 118, 203, 1) } /*简易版的HASHMAP包括基本的GET  PUT思想 * 从数 ...

  9. 移动端学习之理解WEB APP、Native APP、Hybrid APP以及React Native/uniapp包括H5、小程序等的区别与共通之处

    因为工作需要,需要进一步了解移动端的开发,遂返回复习移动端的知识点,在开始学习之前,产生了疑惑WEB APP .Native APP .Hybrid APP.React Native.Uniapp.H ...

  10. 每日一个linux命令3

    Linux 中用pwd命令来查看"当前工作目录"的完整路径. 简单的说,每当你在终端进行操作时,你都会有一个当前工作目录,在不太确定当前位置时,就会使用pwd来判定当前目录在文件系 ...