路由系统
一、实质
url与函数的对应关系,即映射表
位置:urls.py
二、格式
urlpatterns = [ path('admin/', admin.site.urls), ]
path('', views.index),
注意:只要协议、ip和端口号即可
前面是正则表达式,后面是对应的函数
三、捕获参数
通过url获取值 <>
urls.py文件
path('test/<arg1>/', views.test),
views.py文件
def test(request, arg1): print(arg1) return HttpResponse("Hello World %s" % arg1)
注意:两个形参的名字要一致,<>里的值默认类型是str,可以通过<int:arg1>进行数据类型的转换
注意:GET是通过参数获取值,<>是通过路径获取值
应用场景:删除和修改
四、include(路由)
1、在app中新建urls.py文件,作为二级路由的文件
2、一级路由
位置:项目文件夹下的urls.py文件
from django.urls import include # 导入二级路由的urls from app01 import urls as app01_url # home只是单纯的url path('home/', include(app01_url)),
3、二级路由
位置:app中新建的urls.py文件
from django.urls import path from . import views urlpatterns = [ path('json_test/', views.json_test), ]
4、查看
注意:path
五、字典格式的参数,传递给视图函数(一般不这么用)
在二级路由传递参数,注意:字典的格式
from django.urls import path from . import views urlpatterns = [ path('json_test/', views.json_test, {"name": 'tom'}), ]
在views.py文件,接收参数
def json_test(request, **kwargs): data = kwargs.get("name") return HttpResponse(data)
六、反向解析url
1、urls.py 重命名
path('old123/', views.old, name="old_html"),
2、模板系统
<a href="{% url 'old_html' %}">点我,跳转到一个旧网页</a>
<a href="{% url '别名' %}">点我,跳转到一个旧网页</a>
3、视图系统
from django.shortcuts import reverse def old(request): _url = reverse("old_html")
reverse(别名)
含参数的反向解析
1、urls.py文件
path('first/<key>/', views.first, name="first_html"),
2、模板系统
<a href="{% url "first_html" "abc" %}">跳转到第一页</a>
3、视图系统
path('index11/<args>/', views.index, name="index_html"), path('test/', views.test),
def index(request, args): print(request.path_info) print(args) return HttpResponse(args) def test(request): return redirect(reverse("index_html", args=("tom", )))
_url = reverse("index_html", args=("tom", ))
传递参数
补充、re_path
Django2.0以前的版本,(?p<>)
在一级路由可以加上命名空间 namespace
捕获的参数永远是字符串类型
命名空间
1、一级路由
path('home/', include(app01_url, namespace='test')),
2、模板系统
<a href="{% url "test:first_html" "abc" %}">跳转到第一页</a>