大家在用Odoo内建模块,比如销售,采购等模块的查询的功能的时候,觉得非常方便,但是轮到自己做的时候,发现出不了那么多方便的功能项,这是怎么回事?那是因为这些功能需要在我们定制开发的时候写进去,今天我们就来讲如何自定义Search View。
首先,让我们给patient model 增加一个性别字段(gender),方便我们后面的描述,分别加在patient.py
class HospitalPatient(models.Model):
_name = 'hospital.patient'
_inherit= ['mail.thread','mail.activity.mixin']
_description = 'Patient Record'
_rec_name = 'patient_disp_name'
name = fields.Char(string='Define Search View');
patient_disp_name = fields.Char(string='Patient Display Name'); # patient在标题栏的显示信息
name_seq = fields.Char(string='Order Reference', required=True, copy=False, readonly=True,
index=True, default=lambda self: _('New'))
gender = fields.Selection([
('male','Male'),
('female','Female'),
], default='male', string='Gender'); # 新增性别字段
patient_name = fields.Char(string='Name', required=True); # 必填字段
patient_age = fields.Integer(string='Age');
notes = fields.Text(string='Notes');
image = fields.Binary(string='Image');
@api.model
def create(self, vals):
if vals.get('name_seq', _('New')) == _('New'):
vals['name_seq'] = self.env['ir.sequence'].next_by_code('hospital.patient.sequence') or _('New')
result = super(HospitalPatient, self).create(vals)
return result
然后在Form View,Tree View上面都加上这个gender字段
<!-- Patient Form -->
<record id="patient_form" model="ir.ui.view">
<field name="name">hospital.patient.form</field>
<field name="model">hospital.patient</field>
<field name="arch" type="xml">
<form string="Patients">
<sheet>
<div class="oe_title">
<h1>
<field name="name_seq" readonly="1"/>
</h1>
</div>
<group>
<group>
<field name="patient_name"/>
<field name="patient_disp_name"/>
</group>
<group>
<field name="patient_age"/>
<field name="gender"/> <!-- 新增性别字段 -->
</group>
<group>
<field name="notes"/>
<field name="image"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="activity_ids" widget="mail_activity"/>
<field name="message_ids" widget="mail_thread" options="{'post_refresh':'recipients'}"/>
</div>
</form>
</field>
</record>
<!-- Patient Tree -->
<record id="patient_tree" model="ir.ui.view">
<field name="name">hospital.patient.tree</field>
<field name="model">hospital.patient</field>
<field name="arch" type="xml">
<tree string="Patients">
<field name="name_seq"/>
<field name="patient_name"/>
<field name="patient_disp_name"/>
<field name="gender"/> <!-- 新增性别字段 -->
<field name="patient_age"/>
<field name="notes"/>
<field name="image"/>
</tree>
</field>
</record>
然后手工增加几条信息用于做Search测试
当我们在Search...栏输入病人编号的时候,会发现匹配的是Name,所以我们是搜索不到任何信息的
所以我们要对patient_menu.xml增加如下内容,让Odoo对我们的要求有响应,因为Search View简单又直接,所以我们连带定制Filters和Group By就一起讲了
<!--Define Search View -->
<record id="hospital_patient_search" model="ir.ui.view">
<field name="name">hospital.patient.search</field>
<field name="model">hospital.patient</field>
<field name="arch" type="xml">
<search string="Search Patients">
<!-- 病人姓名,编号在filter_domain定义查询关系 -->
<field name="name" filter_domain="['|',('patient_name', 'ilike', self),('name_seq', 'ilike', self)]"/>
<field name="name_seq"/> <!-- 病人编号 -->
<field name="patient_name"/>
<separator/>
<filter string="Male" name="male" domain="[('gender', '=', 'male')]"/>
<filter string="Female" name="female" domain="[('gender', '=', 'female')]"/>
<group expand="0" string="Group By">
<filter string="Gender" name="gender" context="{'group_by':'gender'}"/>
</group>
</search>
</field>
</record>
Upgrade系统后,我们可以看到自定义的Search View生效了
Filter也生效了
Group By也可以用了
一些基本的框架性工作Odoo确实完成的不错,这样我们可以把相当一部分的精力放到业务需求的快速展现上面去