利用django开发web应用, 经常需要进行URL重定向,有时候还需要给URL传递额外的参数。比如用户添加文章完成后需要转到文章列表或某篇文章详情。因此熟练掌握HttpResponseDirect, redirect和reverse这三种方法对于Django Web开发是至关重要,它们在不同的Django模块中。
- HttpResponseDirect – django.http 适合用于重定向到外部URL或固定的URL。
- redirect – django.shortcuts 适合用于重定向到Django内部的URL,如视图函数或模型实例。
- reverse – django.urls 适合用于避免硬编码URL,提高代码可维护性。
HttpResponseDirect方法
HttpResponseRedirect是django首选的URL重定向方法,在django.http模块里。该方法的第一个参数是必要的,是用来重定向的URL地址。这个URL可以是完整的链接(比如’http://127.0.0.1/show/details‘),也可以是一个不包含域名的静态链接(例如‘/index/’)。
该方法会返回一个HTTP重定向响应。优点是简单易用,适合用于重定向到外部URL或固定的URL。缺点是需要手动拼接URL。
如何使用HttpResponseDirect方法。假如有如下3个urls, 一个展示文章,一个添加文章,一个展示文章详情。需要使用该方法在视图中实现两种URL重定向:
或
from django.urls import path, re_path
from . import views
# namespace
app_name = 'blog'
urlpatterns = [
# 展示所有文章
path('/index/', views.ArticleListView.as_view(), name='article_list'),
# 展示文章详情
re_path(r'^article/(?P<pk>d+)/(?P<slug1>[-w]+)/$',
views.ArticleDetailView.as_view(), name='article_detail'),
# 添加文章
re_path(r'^article/create/$',
views.ArticleCreateView.as_view(), name='article_create'),
]
1. 在视图views.py中利用HttpResponse重新定向至不含参数的URL
from .models import Article,
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ArticleForm
def article_create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect("/index/")
else:
form = ArticleForm()
return render(request, 'blog/article_create_form.html', {'form': form})
如果/index/页面有分页功能, 还可以通过使用HttpResponseRedirect(‘/index/?page=2′)直接获取第2页的文章列表。
HttpReponseDirect只支持hard coded urls(硬编码链接), 不能直接使用命名的URL,如使用HttpResponseDirect(‘blog:article_list‘)是错误的。在使用URL命名时,需要先通过URL反向解析方法reverse先对命名URL(article_list)进行解析,然后再使用HttpReponseRedirect定向(如下面的代码)。背后的逻辑是reverse(‘blog:article_list‘)=’/index/’。
......
from django.http import HttpResponseRedirect
from django.urls import reverse
.....
def article_create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('blog:article_list'))
....
2. 在视图views.py中利用HttpResponseDirect重新定向至包含参数的URL
对于包含参数的URL(/article/2/new–day/),使用HttpResponseDirect定向前一般需要先使用reverse方法对命名的URL(如’article_detail‘)进行解析,同时传递参数(如id, slug等)。
from .models import Article
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render
from .forms import ArticleForm
def article_create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save()
return HttpResponseRedirect(reverse('blog:article_detail', args=[str(article.pk), article.slug]))
else:
form = ArticleForm()
return render(request, 'blog/article_create_form.html', {'form': form})
其中最重要的一行代码如下所示,注意参数是如何传递到url的。
reverse('blog:article_detail', args=[str(article.pk), article.slug]
redirect方法
与HttpResponseRedirect类似,也是将用户重定向到指定的URL,但是该方法接受一个URL名称或模型实例作为参数,可以自动解析URL。优点是可以自动解析URL,方便易用。缺点是需要导入模块。
redirect是URL重新定向的便捷方法,在django.shortcuts模块里。HttpResponseRedirect能支持的URL重定向,redirect都支持。比如下面3种重定向是redirect的常规用法。
from django.shortcuts import redirect
from django.urls import reverse
# 案例1
def my_view(request):
...
return redirect('/index/')
# 案例2
def my_view(request):
...
return redirect('http://127.0.0.1/')
# 案例3
def my_view(request):
...
return redirect(reverse('blog:article_list'))
redirect它不仅能根据URL重定向,还可以根据对象Object重定向和根据视图view重定向,根据视图重定向的时候还可以传递额外的参数。
1. 根据对象Object重定向
使用该方法的前提是模型里已经定义了get_asbolute_url方法,使用redirect会自动调用get_absolute_url方法。
from django.shortcuts import redirect
def my_view(request):
...
obj = MyModel.objects.get(...)
return redirect(obj)
2. 根据视图view重定向
使用该方法的前提已对URL进行了命名,且对应了相应的视图。下面案例中redirect会先根据视图函数的名字查找对应url,在传递额外参数。后台工作还是由reverse方法来完成的。
def my_view(request):
...
return redirect('some-view-name', foo='bar')
reverse方法
reverse方法的作用是对已命名的URL进行反向解析,接受一个URL名称作为参数或递相应的参数(args或带key的参数kargs),返回该名称对应的URL字符串。优点是可以避免硬编码URL,易于维护。缺点是需要手动拼接URL名称。该方法位于django.urls模块。reverse方法一般有2种应用场景:
1. 模型中自定义get_absolute_url,并传递参数args
def get_absolute_url(self):
return reverse('blog:article_detail', args=[str(self.pk), self.slug])
from django.urls import reverse
from django.shortcuts import redirect
def my_view(request):
...
return redirect(reverse('admin:app_list', kwargs={'app_label': 'auth'}))
还有一点容易忽略的是reverse方法不仅能对命名的urls进行反向解析,还可以对视图函数进行反向解析,找到需要重新定向的url, 如下面代码所示。当然这个方法并不推荐使用。与此功能相反的是resolve方法,该方法可以根据url找到对应视图函数。
from django.urls import reverse
from blog import views
reverse(views.index)
resolve方法
Django中的resolve()方法是一个非常重要的方法,它用于将URL解析为视图函数。在Django中,URL模式与视图函数的映射关系是通过URLConf文件来定义的。当用户请求一个URL时,Django会根据URLConf文件中的规则来匹配URL,并将其解析为相应的视图函数。这个过程就是由resolve()方法完成的。
resolve()方法的使用方法是:
from django.urls import resolve
result = resolve('/url/')
其中,参数’/url/’是需要解析的URL,返回值result是一个ResolverMatch对象,包含了URL匹配的信息,如匹配的URL、URL中的参数等。
– url:匹配的URL
– func:匹配的视图函数
from django.urls import path
from . import views
urlpatterns = [
path('blog/<int:year>/<int:month>/<int:day>/', views.blog_detail, name='blog_detail'),
]
当用户请求URL ‘/blog/2021/10/10/’ 时,可以使用resolve()方法将其解析为相应的视图函数:
from django.urls import resolve
result = resolve('/blog/2021/10/10/')
print(result.url) # /blog/2021/10/10/
print(result.func) # views.blog_detail
print(result.args) # (2021, 10, 10)
print(result.kwargs) # {}
这样,就可以通过resolve()方法将URL解析为相应的视图函数和参数,进一步处理用户的请求。
微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。
原文地址:https://blog.csdn.net/zhouruifu2015/article/details/130184903
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_29120.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!