2017-07-30 58 views
1

我有一個函數,運行每個視圖來糾正slu。。 例如,如果slug/12-post-about-stuff並且用戶輸入/ 12-post-abot_stof,他們將被正確重定向。問題是,在不同的視圖例如具有不同的URL模式:Django:重定向URL,如果slu is是錯誤的

/posts/post_slug/ 
... 
/posts/post_slug/comments/new 

怎麼我寫的通過固定基於當前的URL蛞蝓名重定向的功能?

編輯:我正在使用board_name和PK參數應用裝飾器到每個視圖。我不知道的是如何動態返回新的url,因爲每個視圖的url格式不同。

def correct_board_url_name(func): 
    def wrapper(request, board_slug): 
     try: 
      pk = int(board_slug.split('-')[0]) 
      board = Board.objects.get(pk=pk) 
      if (board.slug != board_slug): 
       # This does not always work depending on what is entered 
       return redirect(request.get_full_path().replace(board_slug, board.slug, 1)) 
      else: 
       return func(request, board_slug) 
     except: 
      raise Http404('') 
    return wrapper 
+0

你能否解釋多一點? –

+1

您如何計劃將不良網址與正確的網址進行匹配?它是基於PK 12嗎?您是使用基於類還是基於功能的視圖? –

+0

基於類的視圖,爲清晰起見編輯 – mei

回答

2

如果要在多個不同視圖中處理請求,中間件是一個不錯的選擇。

class RedirectMiddleware(object): 
    def process_request(self, request): 
     if request.resolver_match.app_name == 'posts' \ 
       and 'post_slug' in request.resolver_match.kwargs: 
      new_path = None 
      # your logic here 
      if new_path: 
       return redirect(new_path, permanent=True) 
     return 

在設置:

MIDDLEWARE = [ 
    # another middlewares here ... 
    'path.to.RedirectMiddleware', 
]