一、引子
在day17 作業中,我們查看主機詳細信息的時候,是通過 在url 中拼接,傳參數。urls 中匹配 path("detail/",views.detail)
這樣url 變成類似 http://127.0.0.1:8000/detail/?nid=2 今天我們來學習,類似 http://127.0.0.1:8000/detail-3.html 這樣的URL
據說,以前我們使用的方式 ,在seo 時候算是動態頁面,后面這種方式算靜態頁面。可能在做搜索優化的時候有好處吧。
二、開搞栗子
忽略掉數據庫,先在 views 新建一個用戶字典
2.1 動態頁面的栗子
views 代碼:
1 info_dic={ 2 1:{"name":"zhangsan","email":"zhangsan@163.com","age":22}, 3 2:{"name":"lisi","email":"lisi@163.com","age":27}, 4 3:{"name":"wangwu","email":"wangwu@163.com","age":29}, 5 4:{"name":"laoliu","email":"laoliu@163.com","age":30}, 6 5:{"name":"chenpi","email":"chenpi@163.com","age":32}, 7 } 8 9 def index(request): 10 return render(request,"index.html",{"info_dic":info_dic}) 11 12 13 def detail(request): 14 nid=request.GET.get("nid") 15 print(nid,type(nid)) 16 info=info_dic.get(int(nid)) 17 print(info) 18 return render(request,"detail.html",{"info":info})
urls
前端,index.html,
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <h1>用戶信息</h1> 9 10 <ul> 11 {% for k,v in info_dic.items %} 12 <li><a target="_blank" href="/detail/?nid={{ k }}">{{ v.name }}</a></li> 13 {% endfor %} 14 15 </ul> 16 17 18 19 </body> 20 </html>
前端,detail
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <h1>用戶詳細信息</h1> 9 10 <ul> 11 <li>name:{{ info.name }}</li> 12 <li>email:{{ info.email }}</li> 13 <li>age:{{ info.age }}</li> 14 </ul> 15 </body> 16 </html>
結果:
2.2 下面用 正則表達式來 搞URL 匹配,靜態頁面,
urls
views ,
直接在函數中傳參數,nid 形式參數。不像之前需要自己到 reques.method 中去取
結果
上面的栗子中,我們得知參數是通過形參傳遞的,類似定義函數的形參數,
下面再搞一個栗子驗證
參數位置變換后 ,獲取的數值也變了
三、分組傳參
在上面的栗子中,我們知道如果不分組,那么參數就是類似函數的位置參數,靠天吃飯,
很顯然,這樣不方便我們在實際的使用中去調用。那么使用關鍵字參數呢,在URL 匹配中就需要分組
下面搞栗子,變換nid,uid 位置之后,打印的結果是一樣的。
位置參數可以在 *arg 中獲取,關鍵字參數可以在 **kwargs 中獲取
四、總結
路由系統:URL
- 普通url:re_path('^index/',view.index),re_path('^home/',view.Home.as_view())
- 順序傳參:re_path(r'^detail-(\d+)-(\d+).html/',views.detail),這個用*args接收
- 關鍵字傳參:re_path(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html/',views.detail),這個用**kwargs接收,推薦使用這個