在使用Django项目时,一个常见的需求是获得URL的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。

人们强烈希望不要硬编码这些URL(费力,不可扩展且容易产生错误)或者设计一种与URLconf毫不相干的专门的URL生成机制,因为这样容易导致一定程度上产生过期的URL。

换句话讲,需要的是一个DRY机制。除了其它有点,它还允许设计的URL可以自动更新而不用遍历项目的源代码来搜索并替换过期的URL。

获取一个URL最开始想到的信息是处理它视图的标识,查找正确的URL的其他必要的信息有视图参数的类型(位置参数,关键字参数)和值。

Django提供一个办法是让URL映射到URL设计唯一的地方。

你填充你的URLconf,然后可以双向使用它:

  • 根据用户/浏览器发起的URL请求,它调用正确的Django视图,并从URL中提取它的参数需要的值。
  • 根据Django视图的标识和将要传递给它的参数的值,获取与之关联的URL。

第二种方式叫做反向解析URL、反向URL匹配、反向URL查询或简单的URL反查。

在需要URL的地方,对于不同层级,Django提供不同的工具用于URL反查

  • 在模板中:使用url模板标签
  • 在Python代码中:使用django.core.urlesolvers.reverse()函数
  • 在更高层的与处理Django模型实例相关的代码中:使用get_absolute_url()方法

简单来说,就是可以给我们的URL匹配规则起个名字,一个URL匹配模式起一个名字。

这样我们以后就不需要写死URL代码了,只需要通过名字来调用当前的URL。

比如:

url(r"^home", views.home, name="home"),        #给自己的url匹配模式起名为home
url(r"^index/(\d*)", views.index, name="index")#给自己的url匹配模式起名为index

这样,在模板里面可以这样引用:

{% url "home" %}

在views函数中可以这样引用:

from django.urls import reverse
reverse("index", args=("2018", ))

示例,看下面的URLconf:

from django.conf.urls import url
from . import views
urlpatterns = [
url(r"^articles/([0-9]{4})/$", views.year_archive, name="new-year-archive")
]

根据上面代码的设计,某一年nnnn对应的归档的URL是/articles/nnnn

你可以在模板的代码中使用下面的方法获得它们:

<a href="{% url "news-year-archive" 2012 %}">2012 Archive</a>
<ul>
{% for yearvar in year_list%}
<li>
<a href="{% ulr "news-year-archive" yearvar%}">{{ yearvar }} Archive</a>
</li>
{% endfor %}
</ul>

在Python代码中,这么使用:

from django.urls import reverse
from django.shortcuts import redirect def redirect_to_year(request):
year = 2006
return redirect(reverse("news-year-archive", args=(year, )))

如果出于某种原因决定按年归档文章的URL应该调整一下,那么你将只需要修改URLconf中的内容。

在某些场景中,一个视图是通用的,所以在URL和视图之间存在多对一的关系。

对于这些情况,当反查URL时,只有视图的名字还不够。

注意:

为了完成上面例子中的URL反查,你将需要使用命名的URL模式。

URL名称使用的字符串可以包含任意字符,不只限制在合法的Python名称。

当你命名你的url模式时,请确保使用的名称不会与其它应用中名称冲突。如果你的URL模式叫做【comment】,而另外一个应用中也有一个同样的名称,当你在模板中使用这个名称的时候不能保证将插入哪个URL。

在URL名称中加上一个前缀,比如应用的名称,将减少冲突的可能。例如采用【myapp-comment】,而不是一个【comment】。

Django基础之命名URL和URL反向解析的更多相关文章

  1. django url别名和反向解析 命名空间

    url别名和反向解析 我们平时写的url名字都是死的,如果项目过大,需要项目中某个文件名改动一下,那么改动起来就不是一般的麻烦了,所以我们就在定义的时候给url起一个别名,以后不管哪个文件中运用都是用 ...

  2. day58——模板继承、组件、自定义标签和过滤器、inclusion_tag、静态文件配置、url别名和反向解析、url命名空间

    day58 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承它使用) 2. 在母版中定义block块(可以定义多个,整个页面任意位置) {% block co ...

  3. Django框架04 /模板相关、别名/反向解析/路由分发

    Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...

  4. django系列3.2--url的别名和反向解析 reverse

    命名URL和反向解析 在网页中某些要提交的地址等,需要改变的时候,此时网页过多,如果一个一个的去改,工作量巨大,这时就可以用到命名url,在html文件的模版中,只写命名,这样当需要我们改变urls. ...

  5. $Django 路由层(有,无名分组、反向解析、总路由分发、名称空间、伪静态)

    1 简单配置 -第一个参数是正则表达式(如果要精准匹配:'^publish/$')  -第二个参数是视图函数(不要加括号)  -url(r'^admin/', admin.site.urls), 注: ...

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

    利用django开发web应用, 我们经常需要进行URL重定向,有时候还需要给URL传递额外的参数.比如用户添加文章完成后需要转到文章列表或某篇文章详情.因此熟练掌握HttpResponseDirec ...

  7. 分组,命名分组,url的命名和反向解析

    1.位置分组 匹配到参数,按照位置参数的方式传递给视图函数 视图函数需要定义形参接收变量 1.写在url里面的: # 删除 url(r'^del_class/(\d+)',views.del_clas ...

  8. Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间

    Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间 一丶URLconf配置 ...

  9. django 路由层(反向解析)03

    目录 ORM表关系建立 Django请求生命周期流程图 urls.py 路由层 无名分组 有名分组 反向解析 无名分组的反向解析 有名分组的反向解析 以编辑功能为例 路由分发 名称空间 伪静态 虚拟环 ...

随机推荐

  1. Python 流程控制与循环体

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  2. java8【一、lambda表达式语法】

    特点 lambda表达式允许将函数作为方法的参数 lambda表达式更加简洁 特征 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需 ...

  3. PHP如何通过URL访问,获得新的URL 两种方法

    1.1 $url = 'http://passport.drcloud.cn/api/logon.asp?id=1&ru=http://203.158.158.122/store/thirdL ...

  4. C#面向对象(五大基本原则 )

    五大原则 单一职责原则(SRP)开放封闭原则(OCP) 里氏替换原则(LSP) 依赖倒置原则(DIP) 接口隔离原则(ISP)  一.单一职责原则SRP(Single Responsibility P ...

  5. 理解 chroot

    什么是 chroot chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的. ...

  6. vi和vim的使用

    本章内容: vi编辑器简介 vim基本使用 vim使用技巧 一.vim简介 vim是一个全屏幕纯文本编辑器,是vi编辑器的增强版. 二.vim的基本使用 1.vim的工作模式 命令模式:是主要使用快键 ...

  7. Linux学习笔记(一)分区

    一.硬件设备文件名 二.设备文件名 /dev/hda1(IDE硬盘接口) /dev/sda1(SCSI硬盘接口.SATA硬盘接口) 其中,a代表第1个硬盘(以此类推,b为第2个硬盘),1代表第1个分区 ...

  8. 关于pycharm database查看db.sqlites文件提示:Driver class 'org.sqlite.JDBC' not found

    系统重新安装后,启动pycharm存在各种问题,其中一个问题就是在Pycharm中的database里面不能查看sqlite数据库了: 经过一番查找终于找到了问题: 首先问题 是提示这样一个报错: 解 ...

  9. [Abp vNext微服务实践] - vue-element-admin登录二

    简介: Vue Element Admin是基于vue.element ui开发的后台管理ui,abp vNext是abp新一代微服务框架.本篇将会介绍如何改造Vue Element Admin权限验 ...

  10. linux——在windows上搭建linux练习环境

    程序员自己研究——java-linux-php——环境搭建 需要首选准备一个linux环境. 1,可用安装一个虚拟机:VMware虚拟机 2,安装一个VMware大约5分钟左右. 3,截止目前2019 ...