URL 别名和 URL反向解析
我们自己写的 url 里面的路径有可能会更改,如果路径更改了,那么我们前端访问这个路径的标签
(a 标签,form表单等等)里面的属性值也需要手动去改了,这样我们拓展起来就不方便,想想一下
尤其是前端可能不是你写的,那么进行跨部门沟通,会很不方便。
Django 提供一个办法是让URL 映射是URL 设计唯一的地方。你填充你的URLconf,然后可以双向使用它:
- 根据用户/浏览器发起的URL 请求,它调用正确的Django 视图,并从URL 中提取它的参数需要的值。
- 根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。
第一种方式就是直接写路径,第二种方式叫做反向解析URL、反向URL 匹配、反向URL 查询或者简单的URL 反查。
在需要 URL 的地方,对于不同层级,Django 提供不同的工具用于 URL 反查: - 在模板中:使用url模板标签。
- 在Python 代码中:使用django.core.urlresolvers.reverse() 函数。
- 在更高层的与处理Django 模型实例相关的代码中:使用get_absolute_url() 方法。
别名举例子:
url(r'^home', views.home, name='home'), # 给我的url匹配模式起名(别名)为 home,别名不需要改,路径你就可以随便改了,别的地方使用这个路径,就用别名来搞
url(r'^index/(\d*)', views.index, name='index'), # 给我的url匹配模式起名为index
这样 在模板里面可以这样引用:
{% url 'home' %} # 无参数的 模板渲染的时候,被django解析成了这个名字对应的那个url,这个过程叫做反向解析
在 views 函数中可以这样引用:
from django.urls import reverse
reverse("index", args=("2018", ))
视图:
from django.urls import reverse
reverse('别名') reverse('abook') -- /add_book/ #不带参数的
print(reverse('delete_book',args=(71,))) #/delete_book/71/ 带参数的
模板
{% url 'abook' %} 无参数的
{% url 'delete_book' book.id %} 带参数的
注意:
redirect 内部会自动调用 reverse 来进行反向解析
redirect(reverse(‘news-year-archive’, args=(year,)))
redirect(‘news-year-archive’,year) redirect内部会自动调用reverse来进行反向解析