我有一个函数,可以在每个 View 中运行以纠正数据 block 。 例如,如果 slug 是/12-post-about-stuff 并且用户输入/12-post-abot_stof 他们将被正确重定向。问题是不同的 View 有不同的 url 模式,例如:
/posts/post_slug/
...
/posts/post_slug/comments/new
如何编写一个函数,通过根据当前 url 修复 slug 名称来进行重定向?
编辑:我正在使用 board_name 和 pk 参数将装饰器应用于每个 View 。我不知道如何动态返回新的 url,因为每个 View 的 url 格式都不同。
def correct_board_url_name(func):
def wrapper(request, board_slug):
try:
pk = int(board_slug.split('-')[0])
board = Board.objects.get(pk=pk)
if (board.slug != board_slug):
# This does not always work depending on what is entered
return redirect(request.get_full_path().replace(board_slug, board.slug, 1))
else:
return func(request, board_slug)
except:
raise Http404('')
return wrapper
最佳答案
如果您想在许多不同的 View 中处理请求,中间件是一个不错的选择。
class RedirectMiddleware(object):
def process_request(self, request):
if request.resolver_match.app_name == 'posts' \
and 'post_slug' in request.resolver_match.kwargs:
new_path = None
# your logic here
if new_path:
return redirect(new_path, permanent=True)
return
在设置中:
MIDDLEWARE = [
# another middlewares here ...
'path.to.RedirectMiddleware',
]
关于python - Django:如果 slug 错误则重定向 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45405315/