ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC=1,5] >[success] # Django-url 请求映射 ~~~ 1.在settings.py目录下配置好ROOT_URLCONF = '根目录名.urls' 2.通过根目录下from django.conf.urls import url,创建urlpatterns列表 3.通过用户输入的url和urlpatterns中的url进行匹配 4.匹配成功后,导入并调用给定的视图python函数 5.如果匹配失败返回报错信息 ~~~ * **注意:** * url 一定要用$ 结尾 * 不需要在每个url前加反斜杠,因为每个url都有 * 每个正则表达式前面的'r' 是可选的但是建议加上。 它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义。 * * * * * ![](https://box.kancloud.cn/4178c81974a1f23cfd9fb6253cd183eb_572x337.png) >[danger] ##### FBV - 请求映射写法 ~~~ from django.conf.urls import url from . import views urlpatterns = [ url(r'login',views.login), ] ~~~ >[danger] ##### CBV - 请求映射写法 * **注意点:** * `一定在view层用的是 class 定义函数才可以使用` ~~~ from django.conf.urls import url from . import views urlpatterns = [ url(r'index',views.index.as_view()) ] ~~~ </br> * * * * * >[success] # 获取一组url >[info] ### 方法一、Get >[danger] ##### 使用场景 ~~~ 1.通过url 传递参数的时候使用 2.url 样式 http://127.0.0.1:8000/login?num=3 ~~~ >[danger] ##### views 层编写 ~~~ # 设置一个字典 USER_DICT = { "1":{'name':"w"}, "2":{'name':"c"}, "3":{'name':"y"}, } def login(request): if request.method == "GET": # 获取当前url传递的参数 num = request.GET.get('num',None) if num: USER_DIC=USER_DICT.get(num,None) if USER_DICT: # 获取成功后跳转的详情页面 return render(request,'person.html',{'USER_DIC':USER_DIC}) # 初始页面,当获取失败和第一次时候 跳到初始页面 return render(request,"index.html",{'USER_DICT':USER_DICT}) ~~~ >[danger] ##### templates 编写 参数动态生成 ~~~ {% for k,v in USER_DICT.items %} <a href="/login?num={{ k }}">{{ v.name }}</a> {% endfor %} ~~~ * * * * * </br> >[info] ### url设置正则方法一 >[danger] ##### 使用场景 ~~~ 1.所有url都是str类型,例如/test/1,中的1也是str类型 2.获取一组url,获取/test/2017、/test/2018这种变化的url 3.例如:http://127.0.0.1:8000/personinfo/1 后面的数字是动态的 ~~~ **快速知识点:** ~~~ urlpatterns = [ url(r'^test/([0-9]{4})/$',views.index), url(r'^test/([0-9]{4})/([0-9]{2})/$',views.index1), url(r'^test/([0-9]{4})/([0-9]{2})/([0-9]+)/$',views.index2), ] ~~~ ~~~ def index(request,yid) def index1(request,yid,mid) def index2(request,yid,mid,did) ~~~ * * * * * >[danger] ##### url.py 配置 **注意:** 这里做了两个url,一个用来接受所有数据,一个用来正则匹配 ![](https://box.kancloud.cn/7a9a41e9dfc0a0793e4bc9ef2ab4839d_676x172.png) ~~~ from django.conf.urls import url from . import views urlpatterns = [ url(r'person/$', views.person), url(r'personinfo/(\d+)',views.personinfo), ] ~~~ >[danger] ##### views.py 配置 ~~~ # 设置一个字典 USER_DICT = { "1":{'name':"w"}, "2":{'name':"c"}, "3":{'name':"y"}, } # 获取所有数据 def person(request): return render(request,'index.html',{'USER_DICT':USER_DICT}) # 用来接收url的匹配参数,跳转匹配的网址 def personinfo(request,nid): if nid: USER_DIC = USER_DICT[nid] return render(request,"person.html",{'USER_DIC':USER_DIC}) ~~~ >[danger] ##### 多个参数写法 **url:写法** ~~~ url(r'^nid-(\d+)-(\d+)', views.nid), ~~~ **views 写法:** ~~~ #uid,nid 分别是和正则对应url是一一对应 def test(request,uid,nid): #第二种可以利用*arg def test(request,*arg): ~~~ * * * * * >[info] ### url设置正则方法二 >[danger] ##### 命名组通过属性名对应-(?P<属性名>) ~~~ 对应函数为属性名依次对应,函数中的属性名位置可以不用顺序排列 ~~~ **快速知识点:** ~~~ urlpatterns = [ url(r'^test/(?P<year>[0-9]{4})/$',views.index), url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.index1), url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$',views.index2), ] ~~~ * * * * * **第一种** ~~~ def index(request,year): def index1(request,month,year): def index2(request,year,month,day): ~~~ **第二种** ~~~ def test(request,**kwargs) ~~~ >[danger] ##### 小技巧-两个url指向同一函数 ~~~ urlpatterns = [ url(r'^test/page/$',views.index), url(r'^test/page(?P<page>(\d+))/$',views.index), ] ~~~ **views** 设置默认页 ~~~ def index(request,page=1): return HttpResponse(page) ~~~