OpenERP/Odoo 開發中,osv.except_osv 是中斷流程並向用戶顯示錯誤/警告彈窗的標準方式。本文總結三大用法:基本異常拋出、業務邏輯攔截、提示語國際化與變量嵌入。
from openerp.tools.translate import _ from openerp.osv import except_osv
raise except_osv(_('Error!'), _('Error Message.'))
_() 包裹支持翻譯。def __assistant_depmanager_prove(self, cr, uid, ids, context=None):
for qjd in self.browse(cr, uid, ids, context=context):
if qjd.shenqr.user_id.id == uid:
raise except_osv(_('Warning!'), _('you cannot prove yourself'))
return False
elif qjd.tians > 1:
raise except_osv(_('Warning!'), _('There are not enough access'))
return False
return True
在模型方法中驗證業務規則,不合規直接 raise,代碼清晰、事務安全。
Python 代碼中用 _('msgid'),提取工具生成 .po 文件:
#. module: qingjia #: code:addons/qingjia/qingjia.py:0 #, python-format msgid "Warning!" msgstr "提示!" #. module: qingjia #: code:addons/qingjia/qingjia.py:0 #, python-format msgid "you cannot prove yourself" msgstr "您不能審批您自己的請假單"
運行時根據用戶語言自動顯示對應翻譯。
raise except_osv(_('Error!'),
_('Your uid is "%s", name is "%s", the state is "%s"') %
(_(uid), _('王小波'), _(result.state)))
關鍵點:
% 操作符,占位符 %s。_(var) 包裹。msgid 必須與格式化字符串**完全一致**(含引號、標點)。#. module: qingjia #: code:addons/qingjia/qingjia.py:0 #, python-format msgid "Your uid is \"%s\" ,name is \"%s\",the state is \"%s\"" msgstr "你的用戶id是:'%s',姓名是:'%s',請假單狀態是:'%s'"
模型定義 state 選項時同步標記翻譯:
state = fields.Selection([
('draft', _('Draft')),
('wait_prove', _('待批的')),
('proved', _('Proved')),
], string='Status')
.po 文件補全:
msgid "wait_prove" msgstr "待批的"
運行時彈窗將顯示中文狀態名。

_() 包裹**,無例外。msgid **使用完整英文句子**,避免拼接片段導致翻譯上下文缺失。_(var),後者直接 %s。i18n-export 更新 .po 文件,納入版本控制。osv.except_osv 是 OpenERP 異常處理的基石:**拋出即回滾、信息即國際化、變量即可嵌入**。規範使用可構建專業、多語言友好的企業級應用體驗。