如何在Odoo向导点击按钮时生成树视图与透视表并按日期过滤
Odoo向导生成日期过滤的树视图与透视表视图实现方案
需求说明
点击Odoo向导中的按钮时,生成并打开树视图(Tree View)和透视表视图(Pivot View),同时通过向导内的date_from和date_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




