在模板中使用路由
從網站開發的角度分析,網站代表路由,若想將項目定義的路由的路由顯示在網頁上,則要在模板上使用模板語法來生成路由地址。Django內置了一套模板語法,它能將Python的語法轉換成HTML語言,然後通過瀏覽器解析HTML語言並生成相應的網頁內容。
項目環境搭建後,在MyDjango文件夾的urls.py中使用urls.py中使用路由函數path和include定義項目應用文件夾index的路由,代碼如下:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
# 指向內置Admin後臺系統的路由文件sites.py
path('admin/',admin.site.urls),
# 指向index的路由文件urls.py
path('',include('index.urls'))
]
在項目應用的index裏,分別在urls.py和view.py文件中定義路由和視圖函數,並且在模板文件夾templates的index.html文件中編寫模板內容,代碼如下:
# index的urls.py
from django.urls import re_path,path
from . import views
urlpatterns = [
# 添加帶有字符類型、整型和slug的路由
re_path('(?P<year>[0-9]{4})/(?P<month>[0-9]{2}/(?P<day>[0-9]{2})).html',views.mydate,name = 'mydate'),
# 定義首頁的路由
path('',views.index)
]
# templates的index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<span>Hello World!</span>
<br>
<a href="{% url 'mydate' '2020' '04' '10' %}">查看日期</a>
</body>
</html>
現分析index.html的模板內容,模板使用了Django內置的模塊語法url來生成路由地址,模板語法url設有4個不同的參數,其說明如下:
- mydate: 代表命名mydate的路由。.
- 2020: 代表路由地址變量year。
- 04: 代表路由地址變量month。
- 10: 代表路由地址變量day。
注: 變量之間使用空格隔開。
模板語法的參數設置與路由定義是相互關聯的,具體說明如下:
- 若路由地址存在變量,則模板語法url需要設置相應的參數值,參數值之間使用空間隔開。
- 若路由地址不存在變量,則模板語法url只需設置路由命名name即可,無需設置額外參數。
- 若路由地址的變量與模板語法url的參數數量不相同,則在瀏覽器訪問網頁的時候會提示NoReverseMatch at的錯誤信息。
上述例子中,MyDjango文件夾的urls.py在使用函數include定義路由時並沒有設置命名空間namespace。若設置了命名空間namespace,則模板裏使用路由的方式有所變化。下面對MyDjango文件夾urls.py和模板文件夾templates的index.html代碼進行修改:
# MyDjango文件夾的urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
# 指向內置Admin後臺系統的路由文件sites.py
path('admin/',admin.site.urls),
# 指向index的路由文件urls.py
# path('',include('index.urls'))
# 使用命名空間namespace
path('',include(('index.urls','index'),namespace='index')),
]
# templates的index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<span>Hello World!</span>
<br>
{# <a href="{% url 'mydate' '2020' '04' '10' %}">查看日期</a>#}
<a href="{% url 'index:mydate' '2020' '04' '10' %}">查看日期</a>
</body>
</html>
從模板文件index.html可以看出,若項目應用設有命名空間namespace,則模板語法url在使用路由,需要在命名路由name前面添加命名空間namespace並且使用冒號隔開,如:”namespace:name“。若路由在定義過程中使用命名空間namespace,而模板語法url沒有添加命名空間namespace,則在訪問網頁時,Django會提示報錯信息。