我正在尝试构建论坛。在处理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))
但是,当我在函数内部调用重定向它不起作用。我也听说过使用中间件来做到这一点。这是如何工作的,我如何使它只适用于涉及董事会的网站?
这让我回到了重定向,但也导致一个错误,如果它是正确摆在首位。该视图forums.views.board没有返回一个HttpResponse对象。它返回None而不是 – mei
在函数'RedirectIfWrong'你需要添加else语句像它一样'return HttpResponseNotFound('
Page not found
')' –我很困惑。如果它是正确的,我需要它不会返回,因此它可以处理视图的其余部分。阅读时,我发现装饰器和中间件。在这种情况下,这些适合使用吗? – mei