10 如何定义Search View内容(学Odoo,就得Do)

大家在用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确实完成的不错,这样我们可以把相当一部分的精力放到业务需求的快速展现上面去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A:Odoo14有以下几种视图: 1. 列表视图(List view):展示数据表格,每一行对应一个记录。 2. 表单视图(Form view):针对每个记录给出一个表单,可进行编辑操作。 3. 图表视图(Graph view):将数据以图表方式呈现,便于数据分析。 4. 栅格视图(Kanban view):将记录以卡片的形式呈现,方便查看。 5. 日历视图(Calendar view):将记录以日历的形式呈现,展示时间性数据。 以上视图的作用和应用场景在不同的业务流程中有所差异。 针对给出的model Class ma(models.model),如果需要查询本月的全部,可以使用Odoo提供的日期范围过滤器,在视图中使用以下过滤器: <filter name="this_month" string="This Month" domain="[('dat', '>=', datetime.date.today().replace(day=1).strftime('%Y-%m-%d')), ('dat', '<=', datetime.date.today().replace(day=calendar.monthrange(datetime.date.today().year,datetime.date.today().month)[1]).strftime('%Y-%m-%d'))]"/> 如果需要查询本月的全部加上标题是N的全部,可以给过滤器加上标题的过滤条件,如下所示: <filter name="this_month_with_title" string="This Month with title N" domain="[('dat', '>=', datetime.date.today().replace(day=1).strftime('%Y-%m-%d')), ('dat', '<=', datetime.date.today(). replace(day=calendar.monthrange(datetime.date.today().year, datetime.date.today().month)[1]). strftime('%Y-%m-%d')), ('name', '=', 'N')]"/> 针对上述基础上输出json格式,可以使用Odoo提供的JSON API进行操作,具体代码如下: import xmlrpclib import json username = 'admin' pwd = 'password' dbname = 'database' # DB信息 sock_common = xmlrpclib.ServerProxy ('http://localhost:8069/xmlrpc/common') uid = sock_common.login(dbname, username, pwd) # 访问model sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object') search_params = [('dat', '>=', datetime.date.today().replace(day=1).strftime('%Y-%m-%d')), ('dat', '<=', datetime.date.today(). replace(day=calendar.monthrange(datetime.date.today().year, datetime.date.today().month)[1]). strftime('%Y-%m-%d')), ('name', '=', 'N')] result = sock.execute(dbname, uid, pwd, 'pss.ma', 'search_read', search_params, ['name', 'dat']) print json.dumps(result) 针对Odoo14如何继承model并改写原有的字段和新增字段,可以在新的model中继承原有的model,并调用各种Odoo API进行开发操作,具体代码如下: class MaInherited(models.Model): _inherit = 'pss.ma' # 改写字段 date = fields.Date(string='Date', default=lambda self: datetime.date.today().strftime('%Y-%m-%d')) # 新增字段 desc = fields.Char(string='Description') # 自定义方法 def do_something(self): pass 继承后可以对原有的字段进行重命名,修改类型、默认值以及添加新的约束条件。新增字段时需要考虑业务需求和数据类型,通常需要进行数据迁移或初始化。在model中还可以定义各种自定义方法,以便在各种业务场景中进行调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值