1.关于fields.Selection()动态设置selection,选中后页面不显示得问题
model.py
approvalby = fields.Selection(selection = '_get_option', string="审批人", help="字段描述", required=True)
def _get_option(self):
option_list = []
form item in range(10):
option_list += [(item, 'xxxx')]
.............
return option_list
# 上面这种写法,当create以后页面不会显示对应得值
# 我的解决办法,在模型里面再声明一个变量
approvalby = fields.Selection(selection = '_get_option', string="审批人", help="字段描述", required=True)
name = fields.Char()
def _get_option(self):
option_list = []
form item in range(10):
option_list += [(item, 'xxxx')]
.............
return option_list
# 重点
@api.model
def create(self, vals):
list = self._get_option
for item in list:
if item[0] == vals['approvalby']:
vals['name'] = item[1]
return super().create(vals)
# xml文件里面得写法
<group>
<field name="name" attrs="{'invisible':[('name','=',False)]}"/>
<field name="approvalby" attrs="{'invisible':[('name','!=',False)]}"/>
</group>
2.自定义from视图
<record id="mcattendance_form_view_patchcard" model="ir.ui.view">
<field name="name">mc.applymanage.form</field> <!-- name可以随意定义最好与模型名字关联-->
<field name="model">mc.applymanage</field><!--模型-->
<field name="arch" type="xml">
<form string="新建">
<sheet>
<group>
<field name="name" attrs="{'invisible':[('name','=',False)]}"/>
<field name="approvalby" attrs="{'invisible':[('name','!=',False)]}"/>
</group>
</sheet>
</form>
</field>
</record>
3.关于record 的id设置
id必须以模型名作为开始否则系统报错
我把问题2中id该成
4.关于create()、write()、read()的使用
create()新建数据保存到模型之前的操作可以写在这里面
@api.model
def create(self, vals):
"""vals是form中的字段,在这里面可以重新定义新建要保存的数据"""
return super().create(vals)
write()编辑保存数据到模型之前的操作可以写在里面
@api.multi
def write(self, vals):
"""数据保存前的操作"""
return super().write(vals)
read()视图权限操作
odoo有三种视图,tree视图,search视图和form视图,在这里可以结合context对视图进行操作
@api.multi
def read(self, fields=None, load=’_classic_read’):
return super().read(fields=fields, load=load)
5.获取默认值填充到form视图
@api.model
def default_get(self, fields_list): #打开创建窗口获取默认值fields_list:模型字段
result = super(leave, self).default_get(fields_list)
""" 对要填充的数据进行赋值操作"""
return result
6.申明日期时设置当天时间为默认值
applicationdate = fields.Date(string="申请日期", default=fields.Date.context_today)
7.解决模型循环依赖的问题
把几个模块公共需要的模型提出来新建一个模块来放置,然后在需要使用的模型中使用
_inherit = '需要继承的模型名’来继承这个模型的字段
8.“配置权限报错”
8.1、报错提示:constraint 检查错误External ID must be fully qualifiedNone
在字段的标签上需要加上模块名否则报错,但是在menuitem标签上可以只写群组名,
#报错写法
<field name="those_remarks" lang="sub" groups=“群组名"/>
#更正
<field name="those_remarks" lang="sub" groups=“模块名.群组名"/>
9.odoo导航排序问题menuitem
默认情况下menuitem排序和安装顺序有关,有时候我们会发现排序总是在变动如果要固定位置我们需要在标签里面添加sequence属性
<menuitem name="员工" action="" parent="" id="" sequence='1'/>
<menuitem name="部门" action="" parent="" id="" sequence='2'/>
<menuitem name="配置" parent="" id="" sequence='3'/>
10.模型翻译
- 首先在模型根目录创建名为i18的文件夹
- 在系统中点击设置,激活开发者模式, 在设置里面点击加载翻译,弹窗选择要翻译的语言,点击加载
- 加载完毕,我们找到导入导出,点击导出翻译,弹框中,语言选择需要的语言,文件格式选择po,应用是你要翻译的模块名,最后点击导出
- 导出后会有一个弹框,点击zh_CN.po,下载该文件,放到最开始创建的i18文件里面,最后更新升级模块,完毕~
11.以模型为判断条件,显示自定义按钮
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template_02" xml:space="preserve">
<t t-extend="ListView.buttons">
<t t-jquery="div.o_list_buttons" t-operation="append">
<button t-if='widget.modelName == "模型名"' class="btn btn-primary o_button_statistics" type="button">按钮</button>
</t>
</t>
</templates>
12.多个模块公用一个顶级菜单
moduleOne和moduleTwo公用一个模块
模块1:moduleOne
view.xml
<menuitem name="模块" id="modules" sequence="1"/> // 公用顶级菜单
<menuitem name="模块1" id="moduleOne" parent="modules" sequence="1"/>
模块2:moduleTwo
view.xml
<menuitem name="模块2" id="moduleTwo" parent="moduleOne.modules" sequence="2"/>
需要注意的是要用到其他模块菜单id需要简介或者直接的建立模块之间的依赖在__manifest__.py里面配置如:‘depends’: [‘moduleOne’]