我正在建立一个论坛.处理网址时,有一个主板ID和一个主板名称.该名称是为了便于阅读,而id是获取董事会的内容.这意味着如果名称错误或已更改,我想将用户重定向到正确的URL.一些搜索引导我去装饰,但我找不到任何资源教我如何使用它们.
# urls.py
...
url(r'^boards/(?P<board_id>\d+)/(?P<board_name>[^/]+)/$', views.board, name='board'),
...
# views.py
@redirect_if_wrong_boardname
def board(request, board_id, board_name):
...
return render(request, 'forums/board.html', {'board': board})
Run Code Online (Sandbox Code Playgroud)
我如何在装饰器中实现以下逻辑?
board = Board.objects.all().get(pk=pk)
if (board.name != name):
return redirect(request.get_full_path().replace(name, board.name, 1))
Run Code Online (Sandbox Code Playgroud)
经过一番猜测,在我兄弟的帮助下,我偶然发现了一些幸运的帖子,我已经弄清楚了:
# views.py
def redirect_if_wrong_boardname(func):
def wrapper(request, board_id, board_name):
try:
board = Board.objects.get(pk=board_id)
if (board.name != board_name):
return redirect('/boards/' + board.pk + '/' + board.name)
else:
return func(request, board_id, board_name)
except:
return Http404('Board not found')
return wrapper
@redirect_if_wrong_boardname
def board(request, board_id, board_name):
...
return render(request, 'forums/board.html', {'board': board})
Run Code Online (Sandbox Code Playgroud)