页面中使用URL
当我们在页面中需要使用路径的时候,不要硬编码路径,最好使用url标签。例如下面这样的。
<a href="{% url 'hello' '张三' %}">你好,张三</a>
这里url标签中指定的名称是urls.py文件中路径的name参数。
path('hello/<str:name>', views.hello, name='hello')
当项目中存在多个app的时候,需要使用命名空间来区分。做法很简单,在urls.py文件中添加app_name属性。
app_name = 'hello' urlpatterns = [ path('', views.index, name='index'), path('hello/', views.hello, name='hello') ]
然后在标签上添加用冒号分隔开的命名空间名称即可。
<a href="{% url 'hello:hello' '张三' %}">你好,张三</a>
路由系统
路由是关联 url 和处理该 url 函数的过程。Django 的路由都写在 urls.py 文件中的urlpatterns 列表中,由 path() 或 re_path() 作为元素组成。Django2.0版本中path(route, views.对应处理函数)等价于低版本的url(r’^route/$’, views.对应处理函数)。
Django的URL路由流程
Django查找全局urlpatterns变量(urls.py)
按照先后顺序,对URL逐一匹配(匹配 urlpatterns 的每个元素)
找到第一个匹配时停止查找,根据匹配结果执行对应的处理函数
如果没有找到匹配或出现异常,Django进行错误处理
tips:Django的路由不考虑HTTP请求方式,仅根据URL进行路由,即,只要URL相同,无论POST、GET等哪种请求方式都指向同一个操作函数。
路由格式
Urlpatterns 中的 path() 处理字符串路由,re_path() 处理正则表达式路由。正则表达式可以看做字符串的模式。
urlpatterns=[
# [] 表示可省略项
path(route,views.函数名,[向处理函数提供的额外参数(以字典形式表示)],
[该URL模式的别名)]),
re_path(正则表达式,view.对应的处理函数),
]
Django支持三种方式表达route:
精确字符串格式
path('index/', views.index),
Django的转换格式
path('index/<类型:变量名>/', views.index),
e.g. path(index/<int:year>/), views.index),
使用该种格式,视图函数定义时要创建对应的参数来接收获取的值。
转换格式类型:
str,匹配除分隔符(/)外的非空字符,默认类型,即<year>等价于<str:year>;
int,匹配0和正整数;
slug,匹配字母、数字、横杠、下划线组成的字符串,str的子集;
uuid,匹配格式化的UUID,如075194d3-6885-417e-a8a8-6c931e272f00;
path,匹配任何非空字符串,包括路径分隔符,是全集。
如果传入的视图函数参数有多个,可以用到*args或者**kwargs,前者用索引,后者可以用for循环取出值。
正则表达式格式,用的是re_path
# 不提取参数,表示四位数字,每一个数字都是0到9的任意数字;
re_path('index/[0-9]{4}/', views.index)
# 提取参数,将正则表达式提取的四位数字,每一个数字都是0到9的任意数字命名为year;
re_path('index/(?p<year>[0-9]{4})/', views.index)