2012-02-17 85 views
2

我想将页面顶部的菜单项重定向到我正在写的指向他们的孩子的顶部菜单项,如果他们有任何。例如。这个网站有一个关于顶级的网站,下面有几个CMS网页。当用户点击左右时,我想在顶层菜单下显示第一个子页面。django-cms将顶级菜单重定向到第一个孩子

我可以像下面这样做,但感觉不对。我知道我可以做一个静态重定向,但我不想这样做,因为第一个孩子可能会改变(毕竟它是一个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 /页仍处于活动状态。如果有人在那里浏览,这不是世界上最糟糕的事情,他们会得到一个空白的页面,但我宁愿这不会发生。我想如果我写了一个导航扩展,那么同样的缺点就在那里。我想我需要一个编程重定向来重定向到第一个孩子,如果该网页被击中。思考?我可以用模板逻辑来做,但这看起来很疯狂。

+0

有你发现导航修饰符的解决方案?至于django-cms 3.0,似乎还没有好的解决方案,除了我下面提出的小小的黑客... – benzkji 2014-10-14 13:48:31

+0

@benzkji不是真的,我们通常只是在顶层页面上设置重定向,我认为你的小黑客是与任何解决方案 – 2014-10-15 07:44:56

+0

一样好。每当第一个孩子的网址发生变化时,我的黑客就可以让你免于重定向值。根据情况,这可能是一个真正的好处。 – benzkji 2014-10-16 07:49:48

回答

3

公平的警告:这需要重写的CMS版本> 2.4,因为它没有考虑到出版工作流程

解决方案与中间件以及用户重定向的“_subpage”字段的值,触发重定向。

  • 加:你不会有任何空白页
  • 加:这是灵活的,因为它允许将不被重定向到子页面
  • 加页:无需采取任何行动时,第一个孩子的URL发生变化
  • 小缺点:总是有一个重定向(301,虽然没有那么糟糕;)
  • 小缺点:配置有点讨厌,因为您必须在“重定向”字段中输入“_subpage”。绝对不是最终用户批准的。而CMS本身并不能提供更好的解决方案。

-

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() == "_subpage": 
       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 
+0

很好的答案,我修复了一个总是重定向的错误,阻止你发布页面。 – Kin 2014-09-25 22:47:05

+0

任何想法如何使这个递归?我已经尝试过了,但它会继续以绝对网址结尾于/ _subpage/ – Kin 2014-09-25 22:47:34

+0

thx @kin。这个中间件比发布更早,例如2.4 ;-)。 page.get_absolute_url将始终返回包含“_subpage /”的url的“正确”路径...应当添加一个递归辅助函数,当从假期返回时;-) – benzkji 2014-09-28 07:28:50

3

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

然后你就可以进入/约/页的管理员,并添加重定向到/约/儿童页

注:我还没有真正尝试过这个,我刚好碰到这个信息绊倒今天早上。

+0

是的,这很容易,我已经尝试过,它的工作原理,但我不想有任何硬编码的链接,人们必须维护。无论第一个孩子是什么,解决方案都必须重定向到第一个孩子。 – 2012-02-24 19:26:46

相关问题