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

Odoo 8 POS支付行修改求助:新增信用卡类型异常

嘿,这个问题我在Odoo 8 POS定制开发时也踩过坑,咱们一步步拆解解决:

一、先定位核心问题

你遇到的两个现象本质是:

  1. 前端支付行的自定义字段(信用卡类型)没有正确绑定数据模型,导致初始化时自动选中第一个选项
  2. 前端提交的自定义字段值没有正确映射到后端的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:50:59