Odoo14在线学习平台课程URL修改技术咨询
Odoo14在线学习平台课程URL去后缀的控制器层调整方案
1. 先定位控制器核心文件
找到slides模块的控制器文件:slides/controllers/main.py,里面有处理课程详情页的默认路由,大概是这样的:
@http.route(['/slides/<model("slide.slide"):slide>'], type='http', auth="public", website=True) def slide_view(self, slide, **kwargs): # 原有页面渲染逻辑
这里的<model("slide.slide"):slide>是Odoo自带的模型路由转换器,它默认会用URL里的slug(也就是最后那段字符串)去数据库匹配课程记录。你改了compute_website_url生成不带-2的URL,但数据库里slide.slide的slug字段大概率还是Odoo自动生成的带后缀版本(比如gardening-2),所以转换器找不到对应记录,页面会直接404。
2. 先搞定模型层的slug生成(必须前置)
要让URL永久不带后缀,得先改模型的slug生成逻辑,不让Odoo自动给重复名称加后缀:
- 找到
slide.slide模型的代码,修改_compute_website_url或者专门的slug字段计算逻辑,直接用课程名称生成纯slug,跳过重复检查:
from odoo.tools import slugify class SlideSlide(models.Model): _inherit = 'slide.slide' def _compute_website_url(self): for slide in self: # 直接用课程名称生成无后缀slug pure_slug = slugify(slide.name) slide.website_url = f'/slides/{pure_slug}'
改完之后,记得把数据库里对应课程的slug字段(如果有)手动改成无后缀的,或者批量更新一下。
3. 调整控制器的查找逻辑
如果模型的slug已经改成无后缀的了,接下来要确保控制器能通过新slug找到对应记录:
- 如果默认的模型转换器不好使,就把路由改成直接接收slug参数,手动查询记录:
@http.route(['/slides/<string:slide_slug>'], type='http', auth="public", website=True) def slide_view(self, slide_slug, **kwargs): # 要是改了模型的slug字段,就直接按slug字段查询,这里示例用名称匹配 slide = self.env['slide.slide'].sudo().search([('name', 'ilike', slide_slug)], limit=1) # 要是有多个同名课程,得加额外过滤条件(比如分类、创建时间)确保返回唯一记录 if not slide: return request.not_found() # 原有渲染逻辑照抄就行,把查到的slide传入模板 values = { 'slide': slide, # 其他需要的参数保留原来的 } return request.render('slides.slide_view', values)
4. 旧URL重定向(可选但推荐)
为了不让老用户的旧链接失效,可以加个重定向逻辑,把带后缀的URL跳转到新URL:
# 这个路由要放在上面的slide_view路由前面,不然会被覆盖 @http.route(['/slides/<string:old_slug>'], type='http', auth="public", website=True, redirect=True) def slide_redirect_old(self, old_slug, **kwargs): # 去掉URL里的后缀,比如把gardening-2改成gardening original_slug = old_slug.rsplit('-', 1)[0] if '-' in old_slug else old_slug slide = self.env['slide.slide'].sudo().search([('name', 'ilike', original_slug)], limit=1) if slide: return request.redirect(slide.website_url, code=301) # 301永久重定向,对SEO友好 return request.not_found()
5. 最后测试验证
重启Odoo服务,更新模块后:
- 访问新URL
/slides/gardening,确认能正常加载对应课程页面 - 若加了重定向,访问旧URL
/slides/gardening-2,确认能自动跳转到新URL
内容的提问来源于stack exchange,提问作者Foisal Reza
相关产品推荐
相关产品推荐

