在使用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. vim 插件 入门

    vim 手册 vimtutor 精简版本 help user-manual 详细手册 一些vim自带设置 set nu "显示行号 set cursorline "高亮显示当前行 ...

  2. Spring IOC Container

    All the notes are from Spring Framework 5 Doc. 一.Introduction to the Spring IOC Container and Beans ...

  3. Ubuntu18.04通过网线共享网络

    Ubuntu18.04通过网线共享网络 这几天要给实验室一个新电脑装系统,但是实验室路由器好像有点问题,所以决定共享我的笔记本的网络,但是搜了很多教程都是基于Ubuntu16.04的,而Ubuntu1 ...

  4. JDK + Tomcat 安装 + 制作自定义镜像【第 3 篇 系统镜像】

    [第 1 篇 JDK]:https://www.cnblogs.com/del88/p/11842387.html[第 2 篇 Tomcat]:https://www.cnblogs.com/del8 ...

  5. javascript 利用数组制作分页效果

    代码 参数: pageSize:一页的总数 currentPage:当前的页数 skipNum:跳过的数量 arr:数组 返回值: newArr分页后的数组 var pagination = func ...

  6. JPA中的复杂查询

    JPQL全称Java Persistence Query Language 基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在 ...

  7. db2 with用法

    最近在研究db2 递归查询时想到了with,一直以为with只是用来查询递归,但是实际with功能强大,还有更加强大的功能,偶然读到一位大神的文章,对with做了很详细的解读,特贴出来供大家学习研究 ...

  8. Linux--磁盘检查简单介绍

    系统莫名其妙的掉电或磁盘发生问题非常可能导致文件系统的错乱,文件系统若发生错乱,可以使用fsck(file system check)命令进行检查. 使用权限:root用户 选项和参数: -a:检测到 ...

  9. [Abp vNext微服务实践] - 业务开发

    前几篇分别介绍了abp vNext微服务框架.开发环境搭建和vue element admin前端框架接入,在vue element admin中实现用户角色管理基本功能后就可以开始进行业务开发了,本 ...

  10. P2402 奶牛隐藏 二分+网络流

    floyd搞出两点间最短距离 二分判答案 // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; ty ...