フォーラムを構築しようとしています。 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にのみ適用するのですか?
を追加これは私がリダイレクトを返すことができますが、また、それが最初の場所で右である場合、エラーが発生します。ビューforums.views.boardはHttpResponseオブジェクトを返しませんでした。代わりにNoneを返しました – mei
関数 'RedirectIfWrong'では' return HttpResponseNotFound( '
ページが見つかりません
') ' –を返すようなelse文を追加する必要があります。ビューの残りの部分を処理できるようにするには、返さないようにする必要があります。読んでいるうちに私はデコレータとミドルウェアを見つけました。このような状況で使用するのに適していますか? – mei