2017-07-29 13 views
0

フォーラムを構築しようとしています。 urlを処理するときに、ボードIDとボード名があります。ボード名はユーザーが読みやすいように存在します。つまり、誰かがIDを正しく入力したが、ボード名が間違っているか、変更されていると、正しいURLにリダイレクトされます。私はこれを管理する関数を作成しました。なぜなら、この1つのURLだけでなく、ボードが正しいかどうかをチェックする必要があるからです。Djangoが関数内でリダイレクトする

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

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

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

ただし、関数内でリダイレクトを呼び出すと機能しません。私はこれを行うためにミドルウェアを使用することについても聞いています。それはどのように機能し、どのようにボードに関係するURLにのみ適用するのですか?

答えて

1

リターン・

def board(request, board_id, board_name): 
    return RedirectIfWrong(request, board_id, board_name) 
    # ^^^^ 
+0

を追加これは私がリダイレクトを返すことができますが、また、それが最初の場所で右である場合、エラーが発生します。ビューforums.views.boardはHttpResponseオブジェクトを返しませんでした。代わりにNoneを返しました – mei

+0

関数 'RedirectIfWrong'では' return HttpResponseNotFound( '

ページが見つかりません

') ' –

+0

を返すようなelse文を追加する必要があります。ビューの残りの部分を処理できるようにするには、返さないようにする必要があります。読んでいるうちに私はデコレータとミドルウェアを見つけました。このような状況で使用するのに適していますか? – mei

2
def board(request, board_id, board_name): 
    bad = RedirectIfWrong(request, board_id, board_name) 
    if bad: 
     return bad 
    ... 
    return render(request, 'forums/board.html', {'board': board}) 
+0

私はこれをすべてのビューに行う必要がある場合、私はそれが混乱してしまい、全く役に立ちません。ミドルウェアやデコレータでこれを行う方法があるのか​​誰か教えてください。 – mei

+1

私は既に書いたコードを修正しようとしていました。この検証を多くのビューで適用する場合は、この検証ロジックをデコレータに移動し、同じ検証が必要なすべてのビューに適用できます。 – gipsy

関連する問題