You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Odoo向导点击按钮时生成树视图与透视表并按日期过滤

Odoo向导生成日期过滤的树视图与透视表视图实现方案

需求说明

点击Odoo向导中的按钮时,生成并打开树视图(Tree View)透视表视图(Pivot View),同时通过向导内的date_fromdate_to字段过滤视图数据,展示符合日期范围的account.invoice记录。

现有代码问题分析

你的现有代码存在几个关键问题,导致无法实现预期目标:

  • od_gen方法返回的是向导自身的表单视图,没有打开目标数据的树/透视表视图
  • 直接拼接SQL语句存在SQL注入风险,且不符合Odoo推荐的ORM开发规范
  • 没有将日期过滤条件传递到后续打开的视图中

完善后的Python代码

下面是修正后的代码,解决了上述问题,同时遵循Odoo开发规范:

from odoo import models, fields, api
from datetime import datetime, timedelta

class DespatchWizard(models.TransientModel):
    _name = "od.despatch"
    _description = "Despatch Report Wizard"  # 添加模型描述,符合Odoo规范

    date_from = fields.Date('Date From', required=True)
    date_to = fields.Date('Date To', required=True, default=fields.Date.context_today)

    def od_gen(self):
        # 构建日期过滤域,直接传递给视图
        domain = [
            ('od_despatch_date', '>=', self.date_from),
            ('od_despatch_date', '<=', self.date_to)
        ]
        
        # 返回动作,打开account.invoice的树视图和透视表视图
        return {
            'name': 'Despatch Records',
            'view_type': 'form',
            'view_mode': 'tree,pivot',  # 指定同时显示树视图和透视表视图
            'res_model': 'account.invoice',  # 目标数据模型
            'domain': domain,  # 传递过滤条件
            'type': 'ir.actions.act_window',
            'target': 'current',  # 在当前窗口打开,也可改为'new'弹出独立窗口
            'context': self.env.context,  # 传递上下文信息
        }

    # 若无需直接执行SQL,可注释/删除此方法;若必须使用SQL,建议用参数化查询避免注入风险
    def od_mk_qry(self, date_from, date_to):
        qry = """ 
            SELECT od_despatch_date, partner_id, date_invoice 
            FROM account_invoice 
            WHERE od_despatch_date >= %s AND od_despatch_date <= %s
        """
        self.env.cr.execute(qry, (date_from, date_to))
        return self.env.cr.fetchall()

自定义视图配置补充(可选)

如果需要为该场景定制专属的树视图和透视表视图(比如展示特定字段),可以添加以下XML配置:

<odoo>
    <data>
        <!-- 自定义树视图 -->
        <record id="view_account_invoice_despatch_tree" model="ir.ui.view">
            <field name="name">account.invoice.despatch.tree</field>
            <field name="model">account.invoice</field>
            <field name="arch" type="xml">
                <tree string="Despatch Records">
                    <field name="od_despatch_date"/>
                    <field name="partner_id"/>
                    <field name="date_invoice"/>
                    <field name="amount_total"/>
                    <!-- 添加你需要展示的其他字段 -->
                </tree>
            </field>
        </record>

        <!-- 自定义透视表视图 -->
        <record id="view_account_invoice_despatch_pivot" model="ir.ui.view">
            <field name="name">account.invoice.despatch.pivot</field>
            <field name="model">account.invoice</field>
            <field name="arch" type="xml">
                <pivot string="Despatch Pivot Report">
                    <field name="od_despatch_date" type="row"/>
                    <field name="partner_id" type="col"/>
                    <field name="amount_total" type="measure"/>
                    <!-- 根据需求调整透视表的行、列、度量字段 -->
                </pivot>
            </field>
        </record>

        <!-- 关联视图到动作 -->
        <record id="action_account_invoice_despatch" model="ir.actions.act_window">
            <field name="name">Despatch Records</field>
            <field name="res_model">account.invoice</field>
            <field name="view_mode">tree,pivot</field>
            <field name="view_ids" eval="[(5,0,0), (0,0, {'view_mode': 'tree', 'view_id': ref('view_account_invoice_despatch_tree')}), (0,0, {'view_mode': 'pivot', 'view_id': ref('view_account_invoice_despatch_pivot')})]"/>
        </record>
    </data>
</odoo>

如果使用自定义动作,可将od_gen方法的返回值修改为调用该动作ID:

return self.env.ref('your_module_name.action_account_invoice_despatch').read()[0]

关键注意点

  • 使用domain参数直接传递过滤条件,确保视图仅展示符合日期范围的记录
  • 优先使用Odoo ORM而非直接SQL查询,避免安全风险并提升代码可维护性
  • 通过view_mode指定同时显示树视图和透视表视图,用户可自由切换两种视图模式

内容的提问来源于stack exchange,提问作者vbt

火山引擎 最新活动