Django CMS挂载Apphook的页面详情页菜单丢失active类求助
解决Django CMS Apphook页面详情页菜单Active类丢失问题
我之前也碰到过一模一样的情况,其实不用急着去写自定义Apphook菜单,先试试这个更简便的方案:
快速修复:借助request.current_page判断
问题根源在于:当访问Apphook挂载的详情页时,Django CMS默认的菜单节点不会把这些App内的页面关联到对应的CMS页面,所以child.selected和child.ancestor这两个判断条件不会触发。但好在Django CMS会自动把挂载Apphook的那个CMS页面存入request.current_page——哪怕你在App的视图里,这个值也是能正常获取的。
修改你菜单模板里的active类判断逻辑:
<li class="js-submenuParent {% if child.selected or child.ancestor or (request.current_page and child.page == request.current_page) %}active{% endif %}">
为什么这能生效?
当用户打开活动详情页时,request.current_page会指向你挂载Apphook的「活动列表页」CMS页面。通过对比菜单节点的child.page和这个request.current_page,就能给对应的菜单项加上active类,同时保留原来的selected/ancestor判断,完全不影响其他CMS页面的菜单高亮逻辑。
注意事项
- 确保你的Apphook已经正确挂载到目标CMS页面(在CMS页面的「高级」设置里选择对应的Apphook)
- 不要在App的视图里手动修改
request.current_page,保持Django CMS的默认行为即可
备选方案:自定义Apphook菜单
如果上面的方案满足不了你的需求(比如你需要把活动详情页作为子项显示在菜单里),那确实需要自定义Apphook菜单。大致步骤是:
- 创建一个继承自
CMSAttachMenu的菜单类 - 在菜单类的
get_nodes方法里,动态添加活动详情页作为挂载Apphook页面的子节点 - 在App的
cms_app.py文件里注册这个菜单
不过这个方案工作量更大,更适合需要复杂菜单结构的场景。
内容的提问来源于stack exchange,提问作者Mærcos
相关产品推荐
相关产品推荐

