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

Odoo中修改account.move的default_get里journal_id在贷项通知单UI不生效

解决Odoo贷项通知单default_get设置journal_id不生效问题

问题分析

你遇到的核心矛盾是:default_get中已正确赋值out_refund类型的journal_id,但前端UI未同步显示该值,而相同逻辑对out_invoice生效。本质原因是Odoo在贷项通知单表单加载后,会触发move_type的onchange事件,重新计算并覆盖journal_id,发票场景则未触发该覆盖逻辑。

解决方案

放弃在default_get中处理journal_id默认值,转而重写account.move的_get_default_journal方法——这是Odoo原生用于根据move_type获取默认日记账的核心方法,无论default_get还是onchange_move_type都会调用它,能确保前后端值完全一致:

class AccountMove(models.Model):
    _inherit = 'account.move'

    def _get_default_journal(self):
        # 先执行原生逻辑获取默认日记账
        journal = super()._get_default_journal()
        # 针对贷项通知单替换为自定义日记账
        if self.move_type == 'out_refund' and self.env.company.credit_notes_journal_id:
            journal = self.env.company.credit_notes_journal_id
        return journal

对问题的逐一解答

  1. 是否存在default_get前的机制覆盖journal_id?
    不存在。你的调试已确认default_get是表单渲染前最后执行的方法,问题出在default_get之后:贷项通知单属于非默认move_type,打开表单时会触发move_type的onchange事件,调用原生_get_default_journal重新计算日记账,覆盖了你在default_get中设置的值。

  2. 是否需添加@api.onchange让UI生效?
    不需要额外添加@api.onchange。重写_get_default_journal直接覆盖了原生的日记账计算逻辑,确保onchange_move_type触发时也返回你指定的日记账,从根源解决前后端值不一致的问题。

  3. 为何该逻辑对发票生效但对贷项通知单无效?

    • 发票(out_invoice)是Odoo默认的move_type,表单加载时不会触发move_type的onchange事件,因此default_get设置的journal_id不会被覆盖。
    • 贷项通知单(out_refund)是非默认类型,打开表单时会主动切换move_type,触发onchange_move_type方法,调用原生_get_default_journal重新计算日记账,从而覆盖了你在default_get中的设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:08:24