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

Odoo自定义模型数据无法在网站模板表格显示的问题求助

Odoo自定义模型数据无法通过AJAX在网站表格展示(404路由未识别)

问题背景

开发Odoo项目时,尝试将自定义模型brgy.officers的数据通过AJAX加载到网站模板的表格中,但表格无数据显示,网络请求显示JSON路由/get_brgy_officers_data返回404错误,路由未被识别。

已确认:

  • 自定义模型brgy.officers的字段(full_name、position、chairmanship、term_start、term_end、status)定义正确
  • 模板与控制器路由配置已检查,但问题仍存在

相关代码

网站模板 brgy_admin_template.xml

<odoo>
<template id="brgy_admin_template" name="Barangay Administration">
    <t t-extend="website.layout">
        <t t-jquery="div#wrap" t-operation="replace">
            
            <!-- Material CDN -->
            <link href="https://fonts.googleapis.com/icon?family=Material+Icons+Sharp" rel="stylesheet"/>


            <!-- Main stylesheet -->
            <link rel="stylesheet" href="/brgy_management/static/src/css/app.css"/>
        </t>

        <t>
            <!-- Start coding here -->
            <div class="body">
                <div class="container">
                    <!-- Start Aside -->
                    <aside>
                        <div class="top">
                            <div class="logo">
                                <img t-attf-src="/brgy_management/static/src/images/logo.png" alt="Logo"/>
                                <h2>Barangay <span class="danger">Management</span></h2>
                            </div>

                            <div class="close" id="close-btn">
                                <span class="material-icons-sharp">close</span>
                            </div>
                        </div>

                        <div class="sidebar">
                            <a href="#">
                                <span class="material-icons-sharp">dashboard</span>
                                <h3>Dashboard</h3>
                            </a>
                            <h4>MENU</h4>
                            <a href="#" class="active">
                                <span class="material-icons-sharp">groups</span>
                                <h3>Barangay Officials and Staffs</h3>
                            </a>
                            <a href="#">
                                <span class="material-icons-sharp">contact_page</span>
                                <h3>Residents Record</h3>
                            </a>
                            <a href="#">
                                <span class="material-icons-sharp">workspace_premium</span>
                                <h3>Barangay Certificates</h3>
                            </a>
                            <a href="#">
                                <span class="material-icons-sharp">description</span>
                                <h3>Certificate of Indigency</h3>
                            </a>
                            <a href="#">
                                <span class="material-icons-sharp">article</span>
                                <h3>Business Clearances</h3>
                            </a>
                            <a href="#">
                                <span class="material-icons-sharp">report</span>
                                <h3>Blotter Records</h3>
                            </a>
                            <a href="#">
                                <span class="material-icons-sharp">logout</span>
                                <h3>Logout</h3>
                            </a>
                        </div>
                    </aside>
                    <!-- End of Aside -->

                    <!-- Start Main -->
                    <main>
                    <h1>Barangay Administration</h1>
                        <div class="officers">
                            <div class="create-button">
                                <a href="#" class="create-btn">Create</a>
                            </div>
                            <table>
                                <thead>
                                    <tr>
                                        <th>Full Name</th>
                                        <th>Position</th>
                                        <th>Chairmanship</th>
                                        <th>Term Start</th>
                                        <th>Term End</th>
                                        <th>Status</th>
                                    </tr>
                                </thead>
                                <tbody id="officials-table-body"></tbody>
                            </table>
                            <a href="#">Show All</a>
                        </div>
                    </main>
                    <!-- End of Main -->
                </div>
            </div>

            <script src="app.js"></script>
        </t>
    </t>
</template>
</odoo>

控制器 BarangayManagementController

from odoo import http
from odoo.http import request
from odoo.tools import date_utils

class BarangayManagementController(http.Controller):
    @http.route('/barangay_administration', website=True, auth='public')
    def barangay_admin_page(self, **kw):
        officers = request.env['brgy.officers'].search([])  # Fetch all records
        return http.request.render('brgy_management.brgy_admin_template', {'officials': officers})

    @http.route('/get_brgy_officers_data', type='json', auth='public')
    def get_brgy_officers_data(self):
        officers = request.env['brgy.officers'].search([]).read(['full_name', 'position', 'chairmanship', 'term_start', 'term_end', 'status'])
        for officer in officers:
            officer['term_start'] = date_utils.to_string(officer['term_start'])
            officer['term_end'] = date_utils.to_string(officer['term_end'])
        return officers

JS文件 app.js

$(document).ready(function () {
    $.ajax({
        url: '/get_brgy_officers_data',
        dataType: 'json',
        success: function (data) {
            // Code to populate the table
        }
    });
});

问题原因分析

  1. 控制器未被正确加载:模块的初始化文件未导入控制器类,或模块未更新/安装,导致路由未注册到Odoo路由表。
  2. 路由URL冲突:其他模块可能定义了相同的/get_brgy_officers_data路由,覆盖了当前路由。
  3. 静态文件路径错误:app.js的引用路径不正确,导致AJAX代码未执行或请求URL拼写错误。
  4. 路由注册异常:Odoo未识别控制器中的路由,可能是路由装饰器参数配置问题。

解决建议

1. 确保控制器被正确加载

  • 在模块根目录的__init__.py中导入控制器目录:
    from . import controllers
    
  • 在controllers/__init__.py中导入具体控制器:
    from . import BarangayManagementController
    
  • 进入Odoo后台,找到自定义模块,点击升级或重新安装,确保路由被注册。

2. 修改路由为模块专属前缀

为避免路由冲突,给路由添加模块前缀,同时更新AJAX请求URL:

  • 控制器中修改路由:
    @http.route('/brgy_management/get_brgy_officers_data', type='json', auth='public')
    
  • app.js中更新AJAX地址:
    url: '/brgy_management/get_brgy_officers_data',
    

3. 修复静态文件引用路径

模板中app.js的引用需使用完整静态路径,确保文件存放在static/src/js/目录下:

<script src="/brgy_management/static/src/js/app.js"></script>

4. 验证路由注册状态

开启开发者模式后,进入设置 > 技术 > 路由,搜索目标路由,确认是否存在。如果不存在,检查控制器代码是否有语法错误,或模块是否正确安装。

5. 补充:模板直接渲染数据(备选方案)

若AJAX方式暂时无法解决,可直接通过Odoo模板语法在页面加载时渲染数据:
修改模板中的<tbody>部分:

<tbody id="officials-table-body">
    <t t-foreach="officials" t-as="officer">
        <tr>
            <td><t t-esc="officer.full_name"/></td>
            <td><t t-esc="officer.position"/></td>
            <td><t t-esc="officer.chairmanship"/></td>
            <td><t t-esc="officer.term_start"/></td>
            <td><t t-esc="officer.term_end"/></td>
            <td><t t-esc="officer.status"/></td>
        </tr>
    </t>
</tbody>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:05:25