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

Odoo 10采购申请单QWeb报表金额转大写实现排查请求

Odoo 10 金额转大写功能排查与实现建议

先梳理下你目前的操作和代码问题,从你提供的信息来看,主要有几个潜在的问题需要先修正,我帮你一步步拆解:

你的操作步骤

  • 步骤1:通过scaffold命令创建自定义模块
  • 步骤2:编写model.py代码片段(你提供的内容如下)

你提供的代码片段

# -*- coding: utf-8 -*-
from odoo import models, fields, api
from openerp import models, api _
from openerp.tools import amount_to_text_en
from openerp import tools
from openerp.tools.amount_to_text import amount_to_text
class purchase_agreement_u...

代码中的核心问题分析

  1. 导入冲突与语法错误
    Odoo 10已经统一使用odoo作为顶层包名,你同时导入from odoo import ...和from openerp import ...会导致命名空间冲突;而且代码里的from openerp import models, api _是明显的语法错误——这里的_是笔误,应该是想导入翻译函数_,正确写法是from openerp import models, api, _,但更推荐全程统一使用odoo包导入。

  2. 金额转大写函数的冗余导入
    你同时导入了amount_to_text_en和通用的amount_to_text,如果要实现中文金额大写,Odoo 10默认的amount_to_text没有内置中文支持,需要自定义转换逻辑;如果只需要英文大写,保留其中一个导入即可。

  3. 模型继承不完整
    你的模型定义class purchase_agreement_u...没有完成,推测是想继承采购申请单的原生模型(比如purchase.request),必须明确_inherit属性来绑定目标模型,否则无法在原有采购申请单上扩展功能。

修正后的代码示例

下面是调整后的model.py代码,假设你要继承采购申请单模型并添加中文金额转大写的计算字段:

# -*- coding: utf-8 -*-
from odoo import models, fields, api

class PurchaseRequestAmountToText(models.Model):
    _inherit = 'purchase.request'  # 明确继承采购申请单模型,根据实际模型调整

    @api.multi
    def get_amount_in_words(self):
        # 自定义中文金额转大写逻辑
        amount = self.amount_total  # 取采购申请单的总金额字段,根据实际字段调整
        num_cn = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
        unit_cn = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿']
        decimal_unit = ['角', '分']
        
        # 整数部分处理
        integer_part = int(amount)
        decimal_part = int(round((amount - integer_part) * 100))
        
        integer_str = str(integer_part)
        result = []
        for i, num in enumerate(reversed(integer_str)):
            result.append(num_cn[int(num)] + unit_cn[i])
        integer_cn = ''.join(reversed(result)).replace('零拾', '零').replace('零佰', '零').replace('零仟', '零').replace('零零零', '零').replace('零零', '零').rstrip('零')
        
        # 小数部分处理
        decimal_cn = ''
        if decimal_part > 0:
            decimal_cn = num_cn[decimal_part // 10] + decimal_unit[0] + num_cn[decimal_part % 10] + decimal_unit[1]
        elif decimal_part == 0:
            decimal_cn = '整'
        
        return integer_cn + decimal_cn

模板重写注意事项

在重写采购申请单的QWeb模板时,需要调用上面定义的计算字段,示例如下:

<template id="purchase_request_report_inherit" inherit_id="purchase_request.report_purchase_request">
    <xpath expr="//div[@class='page']" position="inside">
        <div class="text-right" style="margin-top:20px;">
            <strong>金额大写:</strong><span t-esc="o.get_amount_in_words()"/>
        </div>
    </xpath>
</template>

额外注意点

  • 确保你的模块在__manifest__.py中添加了正确的依赖,比如'depends': ['purchase_request']
  • 模块安装后记得升级,让模型和模板的修改生效
  • 如果只需要英文金额转大写,直接调用Odoo内置的amount_to_text(amount, lang='en')即可,不需要自定义中文逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:47:47