我想将我正在写的页面中的顶级菜单项重定向,指向他们的孩子,如果有的话。例如。这个网站有一个顶级关于,下面有几个CMS页面。当用户点击about时,我想在顶级关于菜单下显示第一个子页面。
我可以像下面这样做,但感觉不对。我知道我可以进行静态重定向,但我不想这样做,因为第一个孩子可能会改变(毕竟这是一个CMS系统)而且我不希望输入CMS的数据的人必须管理重定向。所以我更喜欢下面的配置重定向。
这是一个非常常见的要求,有这样做的标准方法吗?我想我可以用navigation modifier做到这一点,所以我可能会尝试下一条路线。
<div style="display:none;">{% show_menu 0 1 1 %}</div>
<div id="topmenu">
<ul>
{% for child in children %}
<li>
{% if child.children %}
<a href="{{child.children.0.get_absolute_url}}">
{% else %}
<a href="{{child.get_absolute_url}}">
{% endif %}
{{ child.get_menu_title }}
</a>
</li>
{% endfor %}
</ul>
</div>
关于上述内容,我需要在那里使用show_menu,否则我的自定义菜单中没有数据。有什么方法可以不需要这个吗?
我最不喜欢上述内容的是/ about / page仍处于活动状态。如果有人在那里浏览,那么这不是世界上最糟糕的事情,他们会得到一个空页,但我宁愿这不会发生。我想如果我写了一个导航扩展,那么就会存在同样的缺点。我想我需要一个程序化重定向来重定向到第一个孩子,如果该页面被击中。思考?我可以在模板逻辑中做到这一点,但这看起来很疯狂。
答案 0 :(得分:3)
您可以考虑在settings.py文件中设置CMS_REDIRECTS = True。
然后你可以进入管理员的/ about /页面并将重定向添加到/ about / child-page
注意:我实际上没有试过这个,我今天早上碰巧偶然发现了这些信息。
答案 1 :(得分:3)
2018年:更新版本,适用于cms 3.4+和新的中间件样式兼容available here。添加/ firstchild后,您需要在cms页面的更改列表中编辑/发布重定向页面,因为您猜测它将重定向。
使用中间件和自定义重定向字段值&#34; / firstchild&#34;的解决方案来触发重定向。
from django.shortcuts import redirect
# redirect to first subpage if the "redirect" field is exactly "_subpage"
class RedirectSubpageMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
if request.current_page:
page = request.current_page
if "slug" in view_kwargs and page.get_redirect() == "/firstchild":
subpages = request.current_page.children.all()
if subpages.count():
# can redirect! must make uri!
return redirect(subpages[0].get_absolute_url(), permanent=True)
return None