Django 知识库:redirect()重定向
8131 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