【问题标题】:django-cms redirect top level menu to first childdjango-cms 将顶级菜单重定向到第一个孩子
【发布时间】:2012-02-17 22:42:16
【问题描述】:

我想重定向我正在写的页面中的顶部菜单项,以指向他们的孩子(如果有的话)。例如。这个站点有一个顶层 About,下面有几个 CMS 页面。当用户点击 about 时,我想在顶级 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/ 页面仍然处于活动状态。如果有人浏览那里,他们会得到一个空白页面,这不是世界上最糟糕的事情,但我宁愿这种情况不要发生。我想如果我写了一个导航扩展,也会有同样的缺点。我想如果该页面被点击,我需要一个编程重定向来重定向到第一个孩子。想法?我可能可以在模板逻辑中做到这一点,但这似乎很疯狂。

【问题讨论】:

  • 您是否找到了使用导航修饰符的解决方案?从 django-cms 3.0 开始,除了我在下面提出的小技巧之外,似乎仍然没有好的解决方案......
  • @benzkji 不是真的,我们通常只是在顶级页面上设置重定向,我认为你的小技巧和任何解决方案一样好
  • 好的。每次第一个孩子的 url 更改时,我的 hack 使您免于调整重定向值。根据具体情况,这可能是一个真正的好处。

标签: django django-cms


【解决方案1】:

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


使用中间件和自定义重定向字段值为“/firstchild”的解决方案,以触发重定向。

  • 另外:您不会有任何空白页
  • 另外:它很灵活,因为它允许页面不会被重定向到子页面
  • 加:当第一个孩子的 url 改变时不需要任何操作
  • 小缺点:总是有一个重定向(301,虽然,不是那么糟糕;)
  • 小缺点:配置有点呆板,因为您必须在“重定向”字段中输入“/firstchild”。绝对不是最终用户友好的,但有效。 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

【讨论】:

  • 很好的答案,我修复了一个错误,它总是会重定向,从而阻止您发布页面。
  • 知道如何进行递归吗?我试过了,但它一直转到以 /_subpage/ 结尾的绝对网址
  • 谢谢@kin。这个中间件早于发布,即 2.4 ;-)。 page.get_absolute_url 将始终返回带有包含“_subpage/”的 url 的“正确”路径...应该添加一个递归辅助函数,当从假期回来时 ;-)
  • @Kin 你能把这个修复添加到我的答案中,即编辑它吗?
【解决方案2】:

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

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

注意:我实际上并没有尝试过,今天早上我只是偶然发现了这个信息。

【讨论】:

  • 是的,这很简单,我已经尝试过了,它确实有效,但我不想拥有任何人们必须维护的硬编码链接。解决方案确实必须重定向到第一个孩子,无论第一个孩子是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多