url()函数可以被传入4个参数,两个是必须的:regex和view,两个是可选的:kwargs和name,下面来看一下这些参数是干啥的。
url()参数:regex
“regex”经常被用作正则表达式的缩写,正则表达式是一种对字符串进行模式匹配的语法,对于我们而言,就是对url模式的匹配。Django会把请求的url从第一条正则表达式开始匹配,直到找到一个可以匹配上的正则表达式为止。
需要注意的是,正则表达式并不查询get或者post参数,以及域名,例如,当请求指向https://www.example.com/myapp/,URLconf会查找myapp/。当请求指向https://www.example.com/myapp/?page=3, URLconf还是会查找myapp/
另外,如果您需要正则表达式的帮助,请参阅re
模块的文档,然而,实际上,您不需要是正则表达式的专家,因为您只需要知道如何捕获简单的模式。实际上,复杂的正则表达式的查找性能会很差,所以你可能不应该依靠正则表达式的全部功能。最后,一个性能说明:这些正则表达式是第一次加载URLconf模块时被编译。它们超级快(只要查找不是太复杂,如上所述)。
url()参数:view
当正则表达式被匹配,view函数就会被调用。而且HttpRequest对象会作为第一个参数,其它被正则表达式捕获的值会作为其它参数传入到函数中。
url()参数:kwargs
其它的参数以字典的形式传入
url()参数:name
给你的url起个名字能让你在其它地方明确引用它。这个强大的功能可以让你在修改URL模式的同时只修修改单个文件 。(好吧,没看懂,那我们举个列子:)
创建一个django项目后,添加一个模板页:
URL配置如下:
我们计算加法的时候用的是 /add/4/5/ ,后来需求发生变化,比如改成 /4_add_5/,但在网页中,代码中很多地方都写死的 /add/4/5/。如果这样写“死网址”,会使得在改了网址(正则)后,模板(template),视图(views.py,用以用于跳转),模型(models.py,可以用用于获取对象对应的地址)用了此网址的,
都得进行相应的更改,修改的代价很大,一不小心,有的地方没改过来,就不能用了。那么有没有更优雅的方式来解决这个问题呢?当然答案是肯定的
使用:
<a href="{% url 'add2' 4 5 %}">link</a>
上面的代码渲染成最终的页面是:
<a href="/add/4/5/">link</a>
这样就可以通过 {% url 'add2' 4 5 %} 获取到对应的网址 /add/4/5/
当 urls.py 进行更改,前提是不改 name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成:
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
注意看重点 add 变成了 new_add,但是后面的 name='add2' 没改,这时 {% url 'add2' 4 5 %} 就会渲染对应的网址成 /new_add/4/5/
用在 views.py 或 models.py 等地方的 reverse函数,同样会根据 name 对应的url获取到新的网址。
想要改网址的时候,修改 urls.py 中的正则表达式部分(url 参数第一部分),name 不变的前提下,其它地方都不需要修改
备注:生成url的函数reverse:
from django.core.urlresolvers import reverse # django 1.4.x - django 1.10.x
from django.urls import reverse # django 1.10.x 新的,更加规范了
reverse('add2', args=(4,5))
u'/add/4/5/'
reverse('add2', args=(444,555))
u'/add/444/555/'
reverse 接收 url 中的 name 作为第一个参数,我们在代码中就可以通过 reverse() 来获取对应的网址(这个网址可以用来跳转,也可以用来计算相关页面的地址),只要对应的 url 的name不改,就不用改代码中的网址。
参考:http://code.ziqiangxuetang.com/django/django-url-name.html
所有的努力都值得期许,每一份梦想都应该灌溉!