Django 知识库:redirect()重定向

926 views, 2020/05/13 updated   Go to Comments

上一节我们已经领教到 redirect()reverse() 配合使用的强大威力了。

redirect() 的能力并不止于此。它可以接受 3 种不同的参数:

Model 作为参数

redirect() 可以接收模型作为第一个参数,像这样:

def redirect_view(request, id):
    ...
    obj = SomeModel.objects.get(id=id)
    return redirect(obj)

此时 redirect() 会调用模型实例中的 get_absolute_url() 方法,所以你必须在模型中加上它:

class SomeModel(...)
    ...
    def get_absolute_url(self):
        return reverse('some_url', args=(self.id,))

reverse() 的用法上一节讲过了。

路由部分的写法像这样:

...
path('...', redirect_view, name='...'),
path('...', destination_view, name='some_url')

所以当你请求 redirect_view() 时,redirect() 就帮你跳转到 destination_view() 视图中去了。

View 作为参数

如果你在 url 中有如下需要跳转的地址:

path('...', another_view, name='another_url'),

你还可以通过视图的命名作为参数:

return redirect('another_url', id=id)

依然可以用关键字参数传递变量到被跳转的视图中。

reverse() 的章节中我们是这样写的:return redirect(reverse('foo_name'))。两种写法本质上是一样的,路由都是由 reverse() 解析的,只不过 Django 隐式帮你处理了。

URL 作为参数

第三种方式就更加粗暴了,把 url 字符串作为参数:

return redirect('/your_url/{}/'.format(post.id))

参数也可以通过字符串格式化传递进去,不过这种方式属于硬编码,还是少用为好。

导入路径在这里:

from django.urls import reverse
from django.shortcuts import redirect



本文作者: 杜赛
发布时间: 2020年05月09日 - 16:57
最后更新: 2020年05月13日 - 09:48
转载请保留原文链接及作者
本站使用 Github 评论后端。鉴于国内复杂的网络环境,如遇评论无法加载、发表等问题,请尝试刷新页面,或更换上网姿势。