前言
从本章开始内容将比较深,建议至少看完开发手册再继续:
odoo18的联系人和此前的一样,联系人中包含了人和法人(公司),打开后看起来非常杂乱,此前因为学的不够深入,因此只能靠默认筛选功能去设置,但对于很多新用户来说,筛选其一要点两次,其二不够直观,因此准备在“新建”动作的侧面加一个仅显示公司的按钮,点击后清单视图自动只保留公司,效果如下。
一、总体思路
最开始用AI去自动修改,但被误导到将按钮加到list的字段中,比如如下的继承写法
<xpath expr="//list" position="attributes">
<attribute name="editable">bottom</attribute>
</xpath>
<xpath expr="//list/field[@name='complete_name']" position="after">
<button name="action_view_company" type="object" string="查看" class="oe_highlight" title="查看公司信息"/>
然后就得到了前图中“查看”的状态,每行显示一个botton,刚好因为设置了editable,无法点击查看,因此顺带设置action_view_company可点击打开表单视图,注意new时可浮窗,current新窗。
def action_view_company(self):
self.ensure_one()
# 返回打开公司表单视图的动作
return {
'type': 'ir.actions.act_window',
'name': _('Company'),
'res_model': 'res.partner',
'res_id': self.id,
'view_mode': 'form',
'target': 'new', # 在当前窗口打开
'views': [[False, 'form']], # 强制使用表单视图
}
此后因为比较菜,在源代码内试了将 <button放到<list前面,弹出错误说<list前面不能时data,印象form视图前面可以时 <button和<div的,这样说的话只能另外想办法。最后参考任务列表,另外加CSDN搜索,了解到可以list 内加js-class实现按钮。
总体思路是,创建js_class组件,设置对应的动作和模板,然后组件可放到<list 内。比较奇怪的是“新建”按钮还没有发现在那里。
二、创建步骤
1.文件架构
2.视图调用
crm_extension_views中作为list的属性调用,注意AI一直沉迷于旧版tree,必须强制唤醒为list。
<record id="view_partner_tree_inherit_list" model="ir.ui.view">
<field name="name">res.partner.tree.inherit.list</field>
<field name