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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:34:52