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