You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo销售订单视图:按字段值切换显示日期字段问题

Odoo销售订单确认日期显示解决方案

一、创建正确的计算字段

你之前创建计算字段时错误遍历order_line导致AttributeError,核心问题是逻辑不需要涉及订单行,直接对比当前订单的date_order和create_date即可。在sale.order模型中添加以下计算字段:

from odoo import models, fields

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    display_confirmation_date = fields.Datetime(string='确认日期', compute='_compute_display_confirmation_date')

    def _compute_display_confirmation_date(self):
        for order in self:
            # 优先处理日期均存在的情况
            if order.date_order and order.create_date:
                order.display_confirmation_date = order.date_order if order.date_order > order.create_date else order.create_date
            else:
                # 处理任一日期为空的边界情况
                order.display_confirmation_date = order.date_order or order.create_date

二、配置树视图显示

Odoo视图的attrs不支持字段间直接的大小比较(会触发XMLSyntaxError),因此用计算字段封装逻辑后,再通过attrs控制可见性。继承原有销售订单树视图添加字段:

<record id="view_sale_order_tree_inherit" model="ir.ui.view">
    <field name="name">sale.order.tree.inherit</field>
    <field name="model">sale.order</field>
    <field name="inherit_id" ref="sale.view_sale_order_tree"/>
    <field name="arch" type="xml">
        <!-- 将字段插入到合适位置,示例为date_order之后 -->
        <field name="date_order" position="after">
            <field name="display_confirmation_date" 
                   attrs="{'invisible': [('state', 'not in', ['sale', 'done'])]}"
                   string="确认日期"/>
        </field>
    </field>
</record>

三、错误原因说明

  1. attrs字段比较报错:Odoo视图的域表达式仅支持字段与固定值/上下文变量的比较,不支持字段间的直接大小判断,这类逻辑必须通过计算字段实现。
  2. order_line遍历报错:你的需求仅涉及订单级别的日期对比,无需操作订单行,遍历order_line属于多余操作,且若订单无行时会触发属性错误。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:24:16