2017-07-30 10 views
1

私はスラッグを修正するためにすべてのビューを実行する機能を持っています。 例えば、スラッグが/ about-about-about-stuffであり、ユーザーが/ 12-post-abot_stofを入力すると、それらは正しくリダイレ​​クトされます。問題は、異なるビューは、例えば、異なるURLパターンを持っていることです。Django:スラッグが間違っているとURLをリダイレクト

/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

正しいURLに不正なURLを対応させる計画はありますか?それは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', 
] 
関連する問題