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

Odoo 10固定列表格实现报错及解决方案咨询

解决Odoo 10中DataTables固定列冲突与失效问题

我之前在Odoo项目里处理过几乎一模一样的DataTables固定列需求,你的问题本质是重复引入jQuery导致Odoo自带Bootstrap组件冲突,加上表格结构不符合DataTables要求,才会出现要么报错要么功能失效的情况。下面给你一步步解决的方案:

1. 移除手动引入的jQuery文件

Odoo 10已经自带了兼容的jQuery版本(1.11.x系列),手动引入jquery-1.12.4.js会覆盖全局的$对象,导致Bootstrap的popover等扩展方法丢失——这就是你看到$.().popover is not a function报错的原因。

直接删掉这段注释掉的代码(彻底移除,不要留在模板里):

<!-- <script type="text/javascript" src="/purchase_requisition/static/src/js/jquery-1.12.4.js"></script> -->

2. 修正表格HTML结构

DataTables要求表格必须包含<thead>和<tbody>标签,你的模板里直接在<thead>后写数据行,缺少<tbody>包裹,这会导致DataTables无法正确识别表格结构,初始化失败却没有明显报错。

修改你的View.xml中的表格代码:

<t t-name="rfq_form">
  <table id="vendor_form" class="stripe row-border order-column" >
    <thead>
      <th>Product</th>
      <t t-foreach="all_vendors" t-as="vendor">
        <th class="rfq_head"><t t-esc="vendor.partner_name"/></th>
      </t>
      <th>Final Choose</th>
      <th>Ring the vendor by</th>
    </thead>
    <!-- 新增tbody标签包裹数据行 -->
    <tbody>
      <t t-foreach="lines" t-as="line">
        <tr t-att-class="pol" t-att-data-lineid="line.id" t-att-data-selected="selected">
          <td class="cell_product_name"><t t-esc="line.product_name"/></td>
          <t t-foreach="all_vendors" t-as="vendor">
            <t t-set="i" t-value="0"></t>
            <t t-foreach="line.partners" t-as="partner">
              <t t-if="vendor.partner_id == partner.partner_id">
                <td>
                  <div class="rfq_head edit_price">
                    <input type="text" name="price" t-att-value="partner.price_unit"/>
                    <input type="text" name="sdiscount"/>
                    <input type="number" name="bonus"/>
                    <input type="checkbox" name="select_partner"/>
                  </div>
                </td>
                <t t-set="i" t-value="1"></t>
              </t>
            </t>
            <t t-if="i==0">
              <td></td>
            </t>
          </t>
          <td></td>
          <td></td>
        </tr>
      </t>
    </tbody>
  </table>
</t>

3. 兼容Odoo的jQuery环境初始化DataTables

Odoo内部对jQuery做了封装,直接使用全局$可能会有冲突,建议在你的form_view.js中使用Odoo widget自带的$对象,或者用jQuery全称初始化:

// 如果是在Odoo Widget的render方法中
var table = self.$('#vendor_form').DataTable( {
    scrollY: "300px",
    scrollX: true,
    scrollCollapse: true,
    paging: false,
    fixedColumns: {
        leftColumns: 1,
        rightColumns: 1
    }
});

或者用IIFE包裹避免全局冲突:

jQuery(function($) {
    var table = $('#vendor_form').DataTable( {
        scrollY: "300px",
        scrollX: true,
        scrollCollapse: true,
        paging: false,
        fixedColumns: {
            leftColumns: 1,
            rightColumns: 1
        }
    });
});

4. 验证静态资源加载状态

打开浏览器开发者工具的Network标签,刷新页面后检查以下资源是否成功加载(无404错误):

  • /purchase_requisition/static/src/js/jquery.dataTables.js
  • /purchase_requisition/static/src/js/dataTables.fixedColumns.js
  • /purchase_requisition/static/src/css/jquery.dataTables.css
  • /purchase_requisition/static/src/css/fixedColumns.dataTables.css

如果有资源加载失败,检查文件路径是否和Odoo模块的目录结构一致。

按照这几个步骤操作后,应该既能解决popover的报错问题,又能正常显示DataTables的固定列效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:21