python - Django:如果 slug 错误则重定向 url

标签 python django

我有一个函数,可以在每个 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/

相关文章:

python - djangocms-cascade 不在插件下拉列表中?

python - 如何编写在其内部连接中使用复杂的 "on"子句的 Django 查询?

python - 如何使用 django for 标签在 10 种不同的背景颜色之间旋转

python - 检查日期是否为 UTC 格式

python - 安装 numpy 从

python - 如何使用注释按父模型对子模型进行分组?

python - 将numpy图像转换为PIL图像会产生奇怪的结果

django - 调用create()时`TypeError`。您可能需要将字段设置为只读,或覆盖create()方法

python - 有人能用 Bullet 来 Colab 工作吗?

Python的range()函数不循环