在介绍URL反向解析之前,首先回顾总结一下django中出现url的位置。
URL在Django出现的位置
- 模板层面:
1.超链接中,例如<a href="/home">home</a>
,点击后跳转到home页面
2.表单中,例如,点击后将数据提交到home页面 - 视图函数:通过HttpResponseRedirect(‘url’),实现页面跳转,例如302跳转
URL书写规范
在Django书写URL必须要遵循相应规则,一般有两种书写方式:
- 1.绝对地址,例如
http://127.0.0.1:8000/home/
- 2.相对地址,从
/
根目录写起,避免其他错误,例如<a href="/home/page">page</a>````;假设当前页面是
http://127.0.0.1:8000/home/,如果不从
/目录写起,例如
ok,那么点击该超链接实际上是到
http://127.0.0.1:8000/home/ok```,相当于是当前网页路由目录下的资源。
模板中URL反向解析
- 在模板和视图中通过
path
的路由名称来反向动态查找路由地址 path
语法:path(url, views, name=‘url_name’),例如,```path(’/home’, views.home, name = ‘home_url’)- 实际上相当于将路由绑定了一个别名,而且不管路由地址怎么改,始终可以通过该名称查找到改路由地址
- 在模板中使用
url
标签反向解析
{% url 'url_name' %} # 没有参数的url,位置参数
{% url 'url_name' '参数1' '参数2' ... %} # path转换器或者正则匹配
例如
{% url 'page' '100' %}
{% url home age='18' sex='male' %}
- 需要注意无论是int还是str path转换器,都需要写到引号中,当成字符串传递进去
- 模板中引用实例
<body>
<h2>
<a href="{% url 'home' %}">home</a> # 若标签加引号,则内部的引号应该与之不同,否则会报错
<a href={% url 'music' %}>music</a> # 或者标签不加引号也可
</h2>
</body>
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('/home', views.home, name='home'),
path('/music', views.music, name='music'),
]
此时若在urls.py path更改路由地址名,会发现使用url标签的网址依然有效,会实时动态的跟新路由地址,这样的好处显而易见,我们不用为写死的路由万一发生改变,所有的路由都要手工改一次。
视图中反向解析
- 语法
from django.urls import reverse # 反向解析路由
reverse('别名', args=[], kwargs=[])
# eg:
print(reverse('home', args=[300]))
print(reverse('home', kwargs={'age': 18, 'sex': 'male'}))