odoo tree视图通过字段条件过滤数据记录

        在odoo开发中我们通常会遇到,odoo的tree试图也就是列表视图,过滤掉一些我们不需要的记录,这样的需求很常见,我这里总结一下我常用的几种解决方案,如有更多的好的方案可以私信讨论。

前端方案:

        1.domain 属性

                特点:在进入页面的时候就可以过滤掉不需要的数据

<record id="view_my_model_tree" model="ir.ui.view">
    <field name="name">my.model.tree</field>
    <field name="model">my.model</field>
    <field name="arch" type="xml">
        <tree domain="[('field_to_filter', '=', True)]">
            <field name="field_to_filter" />
            ...
        </tree>
    </field>
</record>

        <tree> 标签中的 domain 属性定义了过滤条件 [('field_to_filter', '=', True)]。这将自动应用过滤条件,只显示字段 field_to_filter 值为 True 的记录。

        2.<filter>标签

                特点:当用户选择过滤器时,列表视图将根据指定的条件进行过滤,只显示符合条件的记录。

<record id="view_my_model_tree" model="ir.ui.view">
    <field name="name">my.model.tree</field>
    <field name="model">my.model</field>
    <field name="arch" type="xml">
        <tree>
            <field name="field_to_filter" />
            ...
            <filter string="Filter by Field" name="field_filter" domain="   [('field_to_filter', '=', True)]" />
        </tree>
    </field>
</record>
  • <tree> 标签表示列表视图。
  • <field> 标签用于显示字段。
  • <filter> 标签用于创建过滤器。
    • string="Filter by Field" 指定过滤器的显示文本。
    • name="field_filter" 指定过滤器的名称。
    • domain="[('field_to_filter', '=', True)]" 定义过滤器的条件,根据字段 field_to_filter 的值为 True 进行过滤。

        当然这个<filter>标签也可以用在search视图中, 用法和上述一样

    <record id="my_view_search" model="ir.ui.view">
        <field name='name'>my.report.search</field>
        <field name='model'>my.report</field>
        <field name='arch' type='xml'>
            <search string="my search">
                <filter name='is_payment' string="..." domain="[('amount', '>', 0)]"/>
                <separator/>
                <filter name='is_mine_group' string="..." domain="[('user_id','=',uid)]" context="{'group_by':'user_id'}"/>
            </search>
        </field>
    </record>

后端方案:

1.search()方法

  在模型的控制器或视图的 render() 方法中,可以通过调用 search() 方法并传递适当的过滤条件来获取过滤后的记录列表。然后,将该列表传递给模板进行显示。

class MyModelController(http.Controller):

    @http.route('/my_model/list', type='http', auth='user', website=True)
    def my_model_list(self, **kw):
        domain = [('field_to_filter', '=', True)]
        records = request.env['my.model'].search(domain)
        return request.render('my_module.my_model_list_template', {'records': records})

2.fields_view_get()

        这是一个模型的特殊方法,用于动态调整视图的行为。在该方法中,你可以根据需要修改 domain 属性,将过滤条件应用于查询结果。

class MyModel(models.Model):
    _name = 'my.model'

    @api.model
    def fields_view_get(self, view_id=None, view_type='tree', toolbar=False, submenu=False):
        result = super(MyModel, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
        if view_type == 'tree':
            doc = etree.XML(result['arch'])
            domain = [('field_to_filter', '=', True)]
            doc.xpath("//tree")[0].set('domain', json.dumps(domain))
            result['arch'] = etree.tostring(doc, encoding='unicode')
        return result

总结:

        当然我以前还重写过基础模型的read()、search_read()方法,这都是在刚接触odoo技穷的时候用到的,好的是还是把功能实现了,但是我认为这个不安全,也不是一个成熟的解决方案,这里就没必要提了。

        在之前一家公司只是偶尔做一下odoo、而到现在这家公司主流是odoo这个框架,也因此对odoo有了更深的认识,也在持续学习,后面继续输出内容,一起成长。

        odoo在玩生态,做Java知道spring框架,其实spring就是一个生态它整合了很多东西进去,也有自己的一套后端处理方案和逻辑,国内搞了这么多年相对已经很成熟了,假如项目不选语言和结构,我想更多人会用spring,odoo不是首选,那为什么会选odoo呢?

我认为有几点原因是选odoo的优势

  1. 快速上手:odoo用的python语言,简单便捷;而且本身odoo结构就很简单,开发模式中又甩掉了JDBC这个过程,ORM这块非常强大,可以说是划时代的思维,我个人比较推崇。所以假如是一个新人小白,不会odoo不会spring首选odoo,假如团队本身spring就很强这点可以忽略。
  2. 集成化:odoo还有一个title,世界第一ERP框架。听这个名称就知道他在ERP这块国外的地位。odoo 提供了一个完整的企业管理解决方案,包括销售、采购、库存、财务、人力资源等模块的集成,对于定制化低的用户,我在开发的时候只需要继承它的模块,拿过来改造一下就可以部署上线使用了,这个是王炸,我想很多人听说这一点就有点坐不住了吧。

当然劣势也很多

  1. 没有spring生态完整,spring的生态可能是国内最完整的生态了,从业人员也多,不缺钱随便找。
  2. python语言在某些方面还是比不上java的,有它自己的缺陷
  3. 它自己的进销存等模块跟国内的产品理念还是有差距,避免不了定制化,甚至高度定制化
  4. spring 框架采用面向对象的设计原则,强调松耦合、模块化和可扩展性,这点旗鼓相当吧,但是我发现开发模块复杂起来后,性能有点差,这点待验证。

一不小心写了这么多,好了今天就到此为止吧,再码就不礼貌了

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Odoo的tree视图可以通过以下方式进行编写: 1. 定义模型 首先,需要定义模型对象。可以使用Odoo的模型类来定义模型对象,例如: ``` from odoo import models, fields class MyModel(models.Model): _name = 'my.model' name = fields.Char('Name') description = fields.Text('Description') ``` 2. 定义tree视图 接下来,需要定义tree视图。可以使用Odoo的视图类来定义tree视图,例如: ``` <odoo> <data> <record model="ir.ui.view" id="my_model_tree_view"> <field name="name">My Model Tree View</field> <field name="model">my.model</field> <field name="arch" type="xml"> <tree> <field name="name"/> <field name="description"/> </tree> </field> </record> </data> </odoo> ``` 在上面的示例中,我们定义了一个名为“my_model_tree_view”的tree视图,并指定了模型对象“my.model”。在tree中,我们定义了两个字段:“name”和“description”。 3. 注册视图 最后,需要将tree视图注册到Odoo中。可以使用Odoo的模块类来注册视图,例如: ``` from odoo import api, SUPERUSER_ID class MyModule(models.Model): _name = 'my.module' @api.model def _register_hook(self): # Register tree view self.env['ir.ui.view'].search([ ('name', '=', 'My Model Tree View'), ('model', '=', 'my.model') ]).write({ 'arch': self.env.ref('my_module.my_model_tree_view').arch }) ``` 在上面的示例中,我们在模块类中注册了tree视图。我们通过搜索现有的视图来找到我们定义的tree视图,并将其arch更新为我们定义的视图arch。 这样,我们就完成了Odoo的tree视图的编写。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值