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 } }); });
问题原因分析
- 控制器未被正确加载:模块的初始化文件未导入控制器类,或模块未更新/安装,导致路由未注册到Odoo路由表。
- 路由URL冲突:其他模块可能定义了相同的
/get_brgy_officers_data路由,覆盖了当前路由。 - 静态文件路径错误:
app.js的引用路径不正确,导致AJAX代码未执行或请求URL拼写错误。 - 路由注册异常: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
相关产品推荐
相关产品推荐

