Odoo 8 POS支付行修改求助:新增信用卡类型异常
嘿,这个问题我在Odoo 8 POS定制开发时也踩过坑,咱们一步步拆解解决:
一、先定位核心问题
你遇到的两个现象本质是:
- 前端支付行的自定义字段(信用卡类型)没有正确绑定数据模型,导致初始化时自动选中第一个选项
- 前端提交的自定义字段值没有正确映射到后端的
pos.payment(或关联模型),所以订单完成后数据没保存
二、前端修改(POS JS + QWeb模板)
1. 扩展支付行模型,绑定自定义字段
在你的POS_CashRegister模块里,重写pos.Paymentline,初始化并导出自定义字段:
function POS_CashRegister(instance, local) { var pos = instance.point_of_sale; var _t = instance.web._t; var QWeb = instance.web.qweb; // 重写Paymentline,添加信用卡类型字段 var _super_paymentline = pos.Paymentline.prototype; pos.Paymentline = pos.Paymentline.extend({ init: function(parent, options) { _super_paymentline.init.apply(this, arguments); // 初始化字段:默认不选中任何选项,避免自动切到第一个 this.credit_card_type = options.credit_card_type || false; }, // 把字段同步到后端需要的JSON结构 export_as_JSON: function() { var json = _super_paymentline.export_as_JSON.apply(this, arguments); // 把前端对象转为后端需要的ID json.credit_card_type_id = this.credit_card_type ? this.credit_card_type.id : false; return json; } }); // 扩展POS模型,加载信用卡类型数据 var _super_posmodel = pos.PosModel.prototype; pos.PosModel = pos.PosModel.extend({ initialize: function(session, attributes) { _super_posmodel.initialize.apply(this, arguments); this.credit_card_types = []; // 从后端拉取信用卡类型数据(替换成你的模型名) this.fetch('your.credit.card.type.model', ['name'], []).then(function(types) { this.credit_card_types = types; }.bind(this)); } }); }
2. 修改QWeb模板,渲染下拉选项并绑定字段
找到POS支付行的模板(通常是pos_paymentline),添加信用卡类型的下拉控件,确保和支付行的字段双向绑定:
<t t-name="pos_paymentline"> <!-- 保留原有模板内容 --> <div class="payment-line-credit-card" style="margin-top:8px;"> <label>信用卡类型:</label> <select t-model="paymentline.credit_card_type"> <!-- 空选项,避免自动选中第一个 --> <option value="">请选择</option> <option t-foreach="widget.pos.credit_card_types" t-as="type" t-att-value="type.id"> <t t-esc="type.name"/> </option> </select> </div> <!-- 保留原有模板内容 --> </t>
三、后端修改(Python模型 + 数据同步逻辑)
1. 给pos.payment添加对应字段
首先在后端扩展pos.payment模型,存储信用卡类型:
from openerp import models, fields class PosPayment(models.Model): _inherit = 'pos.payment' credit_card_type_id = fields.Many2one( 'your.credit.card.type.model', string='Credit Card Type', help='Selected credit card type for this payment' )
2. 重写订单创建逻辑,接收前端传值
修改pos.order的create_from_ui方法,确保前端提交的信用卡类型ID被正确保存到pos.payment:
from openerp import models, api class PosOrder(models.Model): _inherit = 'pos.order' @api.model def create_from_ui(self, orders): # 遍历每个订单,处理支付行的自定义字段 for order in orders: for payment in order['data']['statement_ids']: # payment的结构是 (0, 0, {字段字典}) if 'credit_card_type_id' in payment[2]: # 确保字段名和后端模型一致 payment[2]['credit_card_type_id'] = payment[2].pop('credit_card_type_id') # 调用原方法创建订单 return super(PosOrder, self).create_from_ui(orders)
四、关键注意事项
- 清空POS缓存:修改后一定要重启Odoo服务,然后在POS前端按F5强制刷新,避免旧的JS/模板缓存导致修改不生效
- 字段名一致性:前后端的字段名必须完全匹配(比如前端传
credit_card_type_id,后端模型也要是这个名字) - 避免默认选中:在前端初始化支付行时,不要把
credit_card_type默认设为this.pos.credit_card_types[0],否则会自动切到第一个选项
这样修改后,支付行的信用卡类型选项就不会自动跳转,且订单完成后数据会正确保存到后端啦!
内容的提问来源于stack exchange,提问作者limfit
相关产品推荐
相关产品推荐

