2017-07-29 61 views
0

我正在嘗試構建論壇。在處理URL時,會有一個主板ID和一個主板名稱。板名僅存在用戶可讀性,意思是如果有人正確輸入了ID,但板名錯誤或已更改,則會將其重定向到正確的URL。我創建了一個函數來管理這個問題,因爲我需要多次檢查板子是否正確,而不僅僅是這個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)) 

但是,當我在函數內部調用重定向它不起作用。我也聽說過使用中間件來做到這一點。這是如何工作的,我如何使它只適用於涉及董事會的網站?

回答

1

添加返回

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

這讓我回到了重定向,但也導致一個錯誤,如果它是正確擺在首位。該視圖forums.views.board沒有返回一個HttpResponse對象。它返回None而不是 – mei

+0

在函數'RedirectIfWrong'你需要添加else語句像它一樣'return HttpResponseNotFound('

Page not found

')' –

+0

我很困惑。如果它是正確的,我需要它不會返回,因此它可以處理視圖的其餘部分。閱讀時,我發現裝飾器和中間件。在這種情況下,這些適合使用嗎? – 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