Django2.X—在模板中使用路由

在模板中使用路由

从网站开发的角度分析,网站代表路由,若想将项目定义的路由的路由显示在网页上,则要在模板上使用模板语法来生成路由地址。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会提示报错信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章