2017-07-30 3 views
4

私はフォーラムを構築しています。 URLを処理するときに、ボードIDとボード名があります。名前は読みやすくするためのもので、IDはボードを取り込むものです。これは、名前が間違っているか、または変更された場合、ユーザーを適切なURLにリダイレクトすることを意味します。いくつかの検索は私をデコレータに導いてきましたが、私はそれらの使い方を教えるリソースは見つかりません。カスタムデコレータを書くDjango

# urls.py 
... 
url(r'^boards/(?P<board_id>\d+)/(?P<board_name>[^/]+)/$', views.board, name='board'), 
... 

# views.py 
@redirect_if_wrong_boardname 
def board(request, board_id, board_name): 
    ... 
    return render(request, 'forums/board.html', {'board': board}) 

デコレータに次のロジックを実装するにはどうすればよいですか?

board = Board.objects.all().get(pk=pk) 
    if (board.name != name): 
     return redirect(request.get_full_path().replace(name, board.name, 1)) 

答えて

0

いくつか推測した後、私の弟からの助けと、私はそれを考え出したいくつかの幸運のポスト時につまずく:

# views.py 
def redirect_if_wrong_boardname(func): 
    def wrapper(request, board_id, board_name): 
     try: 
      board = Board.objects.get(pk=board_id) 
      if (board.name != board_name): 
       return redirect('/boards/' + board.pk + '/' + board.name) 
      else: 
       return func(request, board_id, board_name) 
     except: 
      return Http404('Board not found') 
    return wrapper 

@redirect_if_wrong_boardname 
def board(request, board_id, board_name): 
    ... 
    return render(request, 'forums/board.html', {'board': board}) 
+0

がなぜここデコレータ便利なのですか?あなたの実装は、Boardモデルとその特定のURLに強く結びついています。デコレータは、さまざまな機能に再利用可能な動作を交換可能に追加するためにより頻繁に使用されます。あなたは、あなたが望むものを自由に行うことができますが、プロトタイプでない限り、デコレータを使用する珍しい方法です。あなたのコードでは何も問題はありませんが、view関数でもうまくいくでしょう。 –

+0

うん、それはこれが何であるか:例。私はboard_nameパラメータを取る多くのビューでこれの変形を使用する予定です。 – mei

+0

実験を離れて! djangoは非常に柔軟性があり、境界から外れています。 –

関連する問題