2017-07-29 60 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