在使用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. oracle多表关联删除的两种方法

    oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...

  2. 为什么我们需要Pod?(容器设计模式sidecar)

    Pod,是 Kubernetes 项目中最小的 API 对象 容器的本质是进程,就是未来云计算系统中的进程:容器镜像就是这个系统里的".exe"安装包 Kubernetes 就是操 ...

  3. redhad 7.0更换yum源

    1.  卸载红帽yum源 rpm –e $(rpm –qa|grep yum) --nodeps 2.删除所有repo相关文件 rm –rf /etc/yum.conf rm –rf /etc/yum ...

  4. 数据库优化SQL

    sql优化规则: 1.对于查询,尽量不要使用全表扫描,尽量在where子句以及order by所对应的字段建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放 ...

  5. Css解决表格超出部分用省略号显示

    小伙伴们有没有的遇到页面显示时,因为数据太长导致显示的表格某一列过长,从而导致页面的不美观,下面我们来看一看如何用Css样式解决表格超出部分用省略号显示的问题. 主要设置两个样式: table{ ta ...

  6. 忘记root密码,修改方法

    Linux的root密码修改不像Windows的密码修改找回,Windows的登录密码忘记需要介入工具进行解决.CentOS6和CentOS7的密码方法也是不一样的,具体如下: 首先是CentOS 6 ...

  7. mac上配置apidoc环境

    1. 安装node.js 和npm 前往 https://nodejs.org/en/ 下载node.js的最新版本,双击.pkg进行安装 在终端输入 node -v ,如正确输出版本号即安装成功 ( ...

  8. DbHelper简单的使用

    using System; using System.Windows.Forms; using System.Data.SqlClient; namespace WindowsFormsApp3 { ...

  9. 【python】导入自定义模块

    一.直接import 1.当执行文件与要导入的py文件在同一目录下时 假设要在wangyi.py中导入weibo.py文件 import weibo 2.当执行文件与要导入的py文件所在文件夹在同一目 ...

  10. com.android.ddmlib.adbcommandrejectedexception:未经授权的设备。

    出现这种问题的原因是adb被杀死了,根据网上的说法在platform-tools下双击adb.exe 也启动不了. 在命令提示符中执行    adb kill-server adb start-ser ...