2012-02-17 58 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

相關問題