django-cms将顶级菜单重定向到第一个孩子

时间:2012-02-17 22:42:16

标签: django django-cms

我想将我正在写的页面中的顶级菜单项重定向,指向他们的孩子,如果有的话。例如。这个网站有一个顶级关于,下面有几个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仍处于活动状态。如果有人在那里浏览,那么这不是世界上最糟糕的事情,他们会得到一个空页,但我宁愿这不会发生。我想如果我写了一个导航扩展,那么就会存在同样的缺点。我想我需要一个程序化重定向来重定向到第一个孩子,如果该页面被击中。思考?我可以在模板逻辑中做到这一点,但这看起来很疯狂。

2 个答案:

答案 0 :(得分:3)

您可以考虑在settings.py文件中设置CMS_REDIRECTS = True。

然后你可以进入管理员的/ about /页面并将重定向添加到/ about / child-page

注意:我实际上没有试过这个,我今天早上碰巧偶然发现了这些信息。

答案 1 :(得分:3)

2018年:更新版本,适用于cms 3.4+和新的中间件样式兼容available here。添加/ firstchild后,您需要在cms页面的更改列表中编辑/发布重定向页面,因为您猜测它将重定向。


使用中间件和自定义重定向字段值&#34; / firstchild&#34;的解决方案来触发重定向。

  • plus:您没有任何空白页
  • plus:它非常灵活,因为它允许不会重定向到子页面的页面
  • plus:当第一个孩子的网址发生变化时,无需采取任何措施
  • 小缺点:总是有重定向(301,但不是那么糟糕;)
  • 小缺点:配置有点书呆子,因为你必须输入&#34; / firstchild&#34;进入&#34;重定向&#34;领域。绝对不是最终用户友好,但工作。 cms本身并没有提供更好的解决方案(甚至在2018年都没有)。

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