Django路由Path方法的使用詳解
Django路由Path方法
在Django視圖與路由中簡(jiǎn)要提及了Path方法的使用
路由的分發(fā)
當(dāng)前所有路由的配置,都是寫(xiě)在DjangoSite
項(xiàng)目目錄下的urls.py
文件中
from django.urls import path from demo import views as demo_view # 導(dǎo)入demo應(yīng)用中的視圖 from sgin import views as sgin_view # 導(dǎo)入sgin應(yīng)用中的視圖 urlpatterns = [ path('admin/', admin.site.urls), path('index/',demo_view.index), path('events/',sgin_view.event), path('events/detail/',sgin_view.event_detail), ]
在實(shí)際開(kāi)發(fā)過(guò)程中,一個(gè)Django 項(xiàng)目會(huì)包含很多的 應(yīng)用app ,會(huì)有很多的視圖函數(shù)和對(duì)應(yīng)的路由配置,這時(shí)候如果都只在主路由里進(jìn)行配置就會(huì)顯得雜亂無(wú)章。
所以,在實(shí)際開(kāi)發(fā)過(guò)程中,通常會(huì)在每個(gè) app 里,創(chuàng)建各自的 urls.py 路由模塊,然后從根路由出發(fā),將 app 所屬的 url 請(qǐng)求,全部轉(zhuǎn)發(fā)到相應(yīng)的 urls.py 模塊中。
這個(gè)從主路由轉(zhuǎn)發(fā)到各個(gè)應(yīng)用路由的過(guò)程叫做路由的分發(fā),實(shí)現(xiàn)是通過(guò)使用 include() 函數(shù)來(lái)完成的。
admin/
和index/
是屬于demo應(yīng)用的路由,events/
和events/detail/
是屬于sgin應(yīng)用的路由,
在sgin應(yīng)用下新增urls.py
文件,導(dǎo)入path
模塊,導(dǎo)入sgin應(yīng)用下的視圖,然后將DjangoSite
項(xiàng)目目錄下urls.py
文件中屬于sgin應(yīng)用的路由配置復(fù)制過(guò)來(lái)
from django.urls import path from sgin import views as sgin_view # 子路由列表 urlpatterns = [ path('events/',sgin_view.event), path('events/detail/',sgin_view.event_detail), ]
此時(shí),如果在瀏覽器中輸入http://127.0.0.1:8000/events/
是訪問(wèn)不了頁(yè)面的,因?yàn)樽勇酚珊椭髀酚蛇€沒(méi)有建立關(guān)系,需要在DjangoSite
項(xiàng)目目錄下的urls.py
文件中使用 include() 函數(shù)來(lái)建立關(guān)系
from django.urls import path,include # 導(dǎo)入include from demo import views as demo_view from sgin import urls as sgin_urls # 導(dǎo)入sgin應(yīng)用中的子路由模塊 urlpatterns = [ path('admin/', admin.site.urls), path('index/',demo_view.index), path('',include(sgin_urls)), # path('sgin/',include(sgin_urls)), ]
此時(shí),再去訪問(wèn)http://127.0.0.1:8000/events/
,頁(yè)面就可以正常訪問(wèn)了。
既然/events/
路由是屬于 sgin應(yīng)用,也可以改成path('sgin/',include(sgin_urls))
,這樣,訪問(wèn)頁(yè)面的路徑就變成了http://127.0.0.1:8000/sgin/events/
,這樣就更加層次分明。
路由的匹配規(guī)則
通過(guò)ORM與數(shù)據(jù)庫(kù)進(jìn)行交互,將交流會(huì)的數(shù)據(jù)展示到前端,這一步驟已經(jīng)完成,那么,如何通過(guò)點(diǎn)擊交流會(huì),進(jìn)入對(duì)應(yīng)的交流會(huì)詳情頁(yè)面呢?
不同的詳情頁(yè),其對(duì)應(yīng)的url,必定也是不同的,數(shù)據(jù)庫(kù)中交流會(huì)的id,可以作為其唯一標(biāo)識(shí)。例如:
http://127.0.0.1:8000/sgin/events/detail/1 測(cè)試開(kāi)發(fā)交流會(huì)詳情頁(yè) http://127.0.0.1:8000/sgin/events/detail/2 功能測(cè)試交流會(huì)詳情頁(yè)
通過(guò)訪問(wèn)對(duì)應(yīng)的url,進(jìn)入對(duì)應(yīng)的詳情頁(yè)
所以當(dāng)前端傳遞對(duì)應(yīng)的路由時(shí),路由文件要匹配得到對(duì)應(yīng)的規(guī)則,這里就需要對(duì)sgin應(yīng)用目錄下的url.py
文件進(jìn)行修改。前端傳遞的參數(shù) 1、2、3、4
這些會(huì)動(dòng)態(tài)變化的數(shù),用變量detail_id
進(jìn)行接收,且聲明其屬性為整型
- url.py
from django.urls import path from sgin import views as sgin_view # 子路由列表 urlpatterns = [ path('events/',sgin_view.event), path('events/detail/<int:detail_id>',sgin_view.event_detail), # 路由需要匹配一個(gè)整型的id ]
視圖函數(shù)文件里,也需要同步進(jìn)行修改。對(duì)sgin應(yīng)用目錄下的views.py
文件進(jìn)行修改,接收這個(gè)detail_id
,然后根據(jù) id
去查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù),獲取唯一的一個(gè)數(shù)據(jù)對(duì)象,最后將eventdetail
返回給前端模板文件
- views.py
from django.shortcuts import render from django.http import HttpResponse from sgin.models import Event def event(request): eventlist = Event.objects.all() return render(request,'events.html',{'event_list':eventlist}) def event_detail(request,detail_id): # 將detail_id傳遞進(jìn)來(lái) eventdetail = Event.objects.get(id=detail_id) # 根據(jù)id去數(shù)據(jù)庫(kù)中查詢對(duì)應(yīng)的數(shù)據(jù) return render(request,'event_detail.html',{'event_detail':eventdetail})
為了防止detail_id
在數(shù)據(jù)庫(kù)中不存在造成報(bào)錯(cuò),這里查詢這一步操作需要用到錯(cuò)誤處理機(jī)制,可以將數(shù)據(jù)置空,或者返回一個(gè)404頁(yè)面
- 404.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>404 Not Found</title> </head> <body> <h1>您查找的數(shù)據(jù)不存在</h1> </body> </html>
- views.py
from django.shortcuts import render from django.http import HttpResponse from sgin.models import Event def event(request): eventlist = Event.objects.all() return render(request,'events.html',{'event_list':eventlist}) def event_detail(request,detail_id): # 將detail_id傳遞進(jìn)來(lái) try: eventdetail = Event.objects.get(id=detail_id) # 根據(jù)id去數(shù)據(jù)庫(kù)中查詢對(duì)應(yīng)的數(shù)據(jù) except: # eventdetail = '' # 置空數(shù)據(jù) return render(request, '404.html') return render(request,'event_detail.html',{'event_detail':eventdetail})
后端這里的邏輯處理就完成了,接下來(lái)就是,前端通過(guò)點(diǎn)擊交流會(huì),需要有不同的url,根據(jù)這個(gè)url進(jìn)入對(duì)應(yīng)的交流會(huì)詳情頁(yè)面,這里需要對(duì)event.html
文件進(jìn)行修改,將a鏈接
這塊由原來(lái)的<a href="/sgin/events/detail"> {{ event }}</a>
變?yōu)?<a href="/sgin/events/detail/{event.id}"> {{ event }}</a>
- event.html
{% extends "base.html" %} {% block title %} 測(cè)試資料分類 {% endblock %} {% block content %} <ul class="list-group"> {% for event in event_list %} <li class="list-group-item text-center" > <!---對(duì)分類鏈接的url進(jìn)行修改---> <a href="/sgin/events/detail/{{event.id}}" rel="external nofollow" > {{ event }}</a> </li> {% endfor %} </ul> {% endblock %}
最后,詳情頁(yè)內(nèi)容的展示,也需要修改一下,展示測(cè)試交流會(huì)主題、開(kāi)始時(shí)間和地址等相應(yīng)信息
- event_detail.html
{% extends "base.html" %} {% block title %} 測(cè)試交流會(huì)詳情頁(yè) {% endblock %} {% block content %} <div class="panel panel-info"> <div class="panel-heading"> 交流會(huì)詳情頁(yè) </div> <div class="panel-body"> <p>測(cè)試交流會(huì)主題:{{ event_detail.name }}</p> <p>開(kāi)始時(shí)間:{{ event_detail.start_time }}</p> <p>地址:{{ event_detail.address }}</p> <span><a href="/sgin/events/" rel="external nofollow" class="btn btn-info">返回測(cè)試資料分類頁(yè)</a></span> </div> </div> {% endblock %}
啟動(dòng)項(xiàng)目,點(diǎn)擊不同的分類,就可以進(jìn)入不同的詳情頁(yè)了
path方法類型轉(zhuǎn)化器
Django 默認(rèn)支持 5 個(gè)類型轉(zhuǎn)換器,在大多數(shù)情況下,絕對(duì)可以滿足我們的正常業(yè)務(wù)需求,如果不能,Django 同樣提供了自定義轉(zhuǎn)換器。
下面介紹 Django 默認(rèn)支持的轉(zhuǎn)換器,如下所示:
str
:匹配除了路徑分隔符/
之外的非空字符串,這是默認(rèn)的形式;int
:匹配正整數(shù),包含0;slug
:匹配字母、數(shù)字以及橫杠、下劃線組成的字符串;uuid
:匹配格式化的 uuid,如 075194d3-6885-417e-a8a8-6c931e272f00;path
:匹配任何非空字符串,包含路徑分隔符/
。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
PyTorch+LSTM實(shí)現(xiàn)單變量時(shí)間序列預(yù)測(cè)
時(shí)間序列是指在一段時(shí)間內(nèi)發(fā)生的任何可量化的度量或事件。這篇文章主要為大家介紹了PyTorch+LSTM實(shí)現(xiàn)單變量時(shí)間序列預(yù)測(cè)的相關(guān)資料,需要的可以參考一下2023-02-02Python光學(xué)仿真理解Jones矩陣學(xué)習(xí)
這篇文章主要為大家介紹了Python光學(xué)仿真理解Jones矩陣的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10Python 2.x如何設(shè)置命令執(zhí)行的超時(shí)時(shí)間實(shí)例
這篇文章主要給大家介紹了關(guān)于Python 2.x如何設(shè)置命令執(zhí)行超時(shí)時(shí)間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說(shuō)明
這篇文章主要介紹了python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python queue隊(duì)列原理與應(yīng)用案例分析
這篇文章主要介紹了Python queue隊(duì)列原理與應(yīng)用,結(jié)合具體案例形式分析了Python queue隊(duì)列的原理、功能、實(shí)現(xiàn)方法與使用技巧,需要的朋友可以參考下2019-09-09Python?Pygame實(shí)戰(zhàn)之打磚塊游戲的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)經(jīng)典的游戲—打磚塊。玩家操作一根螢?zāi)簧纤降摹鞍糇印?,讓一顆不斷彈來(lái)彈去的“球”在撞擊作為過(guò)關(guān)目標(biāo)消去的“磚塊”的途中不會(huì)落到螢?zāi)坏紫隆8信d趣的小伙伴可以了解一下2022-03-03Django自定義用戶表+自定義admin后臺(tái)中的字段實(shí)例
今天小編就為大家分享一篇Django自定義用戶表+自定義admin后臺(tái)中的字段實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11