Django基础(10): URL重定向的HttpResponseDirect, redirect和reverse的用法详解

时间:2021-10-05 08:33:49

利用django开发web应用, 我们经常需要进行URL重定向,有时候还需要给URL传递额外的参数。比如用户添加文章完成后需要转到文章列表或某篇文章详情。因此熟练掌握HttpResponseDirect, redirect和reverse这三种方法对于Django Web开发是至关重要。今天小编我就带你看下Django URL重定向的HttpResponseDirect, redirect和reverse方法的详细用法。

HttpResponseDirect方法

HttpResponseRedirect是django首选的URL重定向方法,在django.http模块里。该方法的第一个参数是必要的,是用来重定向的URL地址。这个URL可以是完整的链接(比如’http://www.baidu.com‘),也可以是一个不包含域名的静态链接(例如‘/index/’)。

我们下面以新闻博客(blog)为例来看看如何使用HttpResponseDirect方法。假如我们有如下3个urls, 一个展示文章,一个添加文章,一个展示文章详情。我们需要使用该方法在视图中实现两种URL重定向:

转向不含参数的URL: 用户添加文章完成后转向文章列表(/index/); 或

转向包含参数的URL: 用户添加文章完成后转向文章详情(/article/2/new-day/)

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方法

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('https://www.baidu.com/')

# 案例3
def my_view(request):
   ...
   return redirect(reverse('blog:article_list'))
redirect真正NB的地方在于,它不仅能根据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进行反向解析,还传递相应的参数(args或带key的参数kargs)。该方法位于django.urls模块。reverse方法一般有2种应用场景:

在模型中自定义get_absolute_url时使用,传递参数

在视图中对命名URL进行解析,传递参数,再使用HttpResponseDirect和redict进行重定向

1. 模型中自定义get_absolute_url,并传递参数args

def get_absolute_url(self):
   return reverse('blog:article_detail', args=[str(self.pk), self.slug])

2. 在视图中配合URL重定向使用,并传递kargs

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)

小结

HttpResponseDirect, redirect和reverse三个方法都非常常用,在使用它们前忘了import进来哦。注意它们在不同的模块。

HttpResponseDirect - django.http

redirect - django.shortcuts

reverse - django.urls

Django基础(10): URL重定向的HttpResponseDirect, redirect和reverse的用法详解的更多相关文章

  1. Spring Boot 2&period;x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  2. Android基础夯实--重温动画(五)之属性动画 ObjectAnimator详解

    只有一种真正的英雄主义 一.摘要 ObjectAnimator是ValueAnimator的子类,它和ValueAnimator一样,同样具有计算属性值的功能,但对比ValueAnimator,它会更 ...

  3. MySQL基础篇&lpar;04&rpar;:存储过程和视图,用法和特性详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.存储过程 1.概念简介 存储程序是被存储在服务器中的组合SQL语句,经编译创建并保存在数据库中,用户可通过存储过程的名字调用执行.存储过程 ...

  4. 10&period;Spark Streaming源码分析&colon;Receiver数据接收全过程详解

    原创文章,转载请注明:转载自 听风居士博客(http://www.cnblogs.com/zhouyf/)   在上一篇中介绍了Receiver的整体架构和设计原理,本篇内容主要介绍Receiver在 ...

  5. Android基础夯实--重温动画(四)之属性动画 ValueAnimator详解

    宝剑锋从磨砺出,梅花香自苦寒来:千淘万漉虽辛苦,吹尽狂沙始到金: 长风破浪会有时,直挂云帆济沧海 一.摘要 Animator类作为属性动画的基类,它是一个抽象类,它提供了实现动画的基本架构,但是我们不 ...

  6. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  7. django基础 -- 10&period;form &comma; ModelForm &comma;modelformset

    一.生成页面可用的 HTML标签 1.form 所有内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label ...

  8. python django基础二URL路由系统

    URL配置 基本格式 from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数 ...

  9. 浅谈Django基础(HttpResponse、render、redirect)

    1. 使用之前先导入他们 from django.shortcuts import HttpResponse, render, redirect 2. HttpResponse: 它是作用是内部传入一 ...

随机推荐

  1. 横瓜先生如何用MDB和XLS等低性能数据库来处理千亿级数据量。

    横瓜先生如何用MDB和XLS等低性能数据库来处理千亿级数据量. 横瓜先生曾经用ACCESS做数据库,开发出高性能CMS来处理过TB级的文本数据量,任何请求都可以在10MS内完成,基本就是硬盘延迟的时间 ...

  2. 利用Xtrabackup备份集合恢复一台从库的过程

    1 time tar -xvf Open..tarx.gz real    35m22.502s user    10m16.499s sys     1m28.578s You have new m ...

  3. 在Visual Studio 2013 中使用C&plus;&plus;单元测试

    本文主要介绍在Visual Studio 2013中对代码进行单元测试的方法,包含了两方面的内容:对已有的Dll文件进行单元测试,以及对已有的源文件进行单元测试. 1. VS2013对DLL文件的单元 ...

  4. &lbrack;国嵌攻略&rsqb;&lbrack;165&rsqb;&lbrack;usb下载线驱动设计&rsqb;

    查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d ...

  5. Redis入门简述

    Redis 是一个开源的,使用 ANSI C (C语言)编写,高性能的 Key-Value(键值对) 的 NoSQL 数据库 NoSQL = Not Only SQL,意即“不仅仅是SQL”,是一项全 ...

  6. idea下使用Git基本操作(转载)

    IDEA中Git的更新.提交.还原方法: https://blog.csdn.net/geng31/article/details/78585557 IDEA中Git的提交到GitHub http:/ ...

  7. IntelliJ IDEA src下新建包&comma; 没有层级结构

    新建项目后再src先右键点击新建包  com.example  , 然后想在com.example 包中包含其他包, 当点击src新建包后,出现如图的情况 解决: 继续在src上右键新建package ...

  8. vue使用方法计算总金额

    1.预览 2.index.html <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  9. Android 开发&colon;由模块化到组件化&lpar;一&rpar;

    在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...

  10. Xshell Xftp 免费版 (xshell6 评估期已过 解决办法)

    xshell6 评估期已过,因为下载的版本是evaluation版本,是有期限的. 大家可以修改为Home and school use 的版本,这样就不会出现这个提示了. 具体的操作步骤如下: 1. ...