Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

Django URL 路徑設置|name 參數與命名空間(Namespace)

最後更新:2024年11月28日Python

本文為 Django 進階教學,第 2 篇:

  1. 理解 Django 中的相對路徑與絕對路徑
  2. Django URL 路徑設置|name 參數與命名空間(Namespace) 👈 所在位置
  3. Django 串接資料庫與模型建構:完整入門指南
  4. Django 模型遷移與資料庫同步完整指南
  5. 使用 Django ORM 將資料寫入資料庫:新手入門指南
  6. Django 實現 CRUD 的 C(Create):新增資料功能完整指南
  7. Django CRUD 的 R(Read):資料讀取與顯示功能指南
  8. Django CRUD 的 U(Update):資料更新功能完整指南
  9. Django CRUD 的 D(Delete):資料刪除功能完整指南

建議閱讀本文前,先閱讀完 Django 新手教學 系列文

在 Django 中,urls.py 是管理 URL 路徑的核心配置文件。

有效地設置與命名 URL 不僅能讓代碼更清晰,也能在專案變得複雜時降低維護成本。

本文將介紹設置路徑的最佳實踐,包括推薦的模組引用方式、name 參數的意義與應用,以及命名空間(namespace)的使用。


項目目錄結構示意圖

以下是我們設定 URL 路徑所涉及的目錄結構示意圖:

mysite/
│
├── manage.py
├── mysite/
│   ├── settings.py
│   ├── urls.py         # 主應用路由
│
├── resumes/            # Resumes 應用
│   ├── __init__.py
│   ├── views.py        # 定義視圖函數
│   ├── urls.py         # Resumes 應用路由
│   ├── templates/
│       ├── resumes/
│           ├── home.html  # Resumes 應用的模板文件

設置應用的 URL 路徑

在 resumes/urls.py 中,設置應用的路徑如下:

from django.urls import path
from . import views

urlpatterns = [
    path("", views.home),         # 根路徑對應 home 視圖
    path("new/", views.new)       # "new/" 路徑對應 new 視圖
]

推薦的模組引用方式

我們建議使用 from . import views 的方式,而非逐一從模組導入函數。

例如:

from . import views

這樣當我們在 views.py 中新增函數後,不需要修改 urls.py 中的 from 引用,只需直接在 path() 函數中調用 views.函數名稱 即可,例如:

urlpatterns = [
    path("", views.home),
    path("new/", views.new),
    path("edit/", views.edit),   # 無需修改 from 引用,只新增 path
]

這種方式可以有效減少代碼重複,特別是在視圖函數多且經常變動的情況下,讓 URL 配置文件更易於維護。


使用 name 參數為路徑命名

為 URL 路徑添加 name 參數可以為每個路徑指定唯一標識,便於在模板或代碼中動態引用。

例如:

urlpatterns = [
    path("", views.home),
    path("new/", views.new, name='resume_new')
]

name 的作用與實際應用

假設原始模板中硬編碼路徑如下:

<a href="/resumes/new">新增 resume</a>

如果後期路徑從 /resumes/new 改為 /resumes/create,需要逐一修改所有引用該路徑的模板。

改用命名路由後,模板代碼如下:

<a href="{% url 'resume_new' %}">新增 resume</a>

只需更新 urls.py:

path("create/", views.new, name='resume_new')

所有使用 resume_new 名稱的模板會自動更新,無需再逐一修改代碼,極大地降低了維護成本。


使用命名空間(Namespace)避免路徑名稱衝突

命名衝突問題

當多個應用中使用相同的路徑名稱時,會引發命名衝突。

例如:

# resumes/urls.py
urlpatterns = [
    path("new/", views.new, name='new'),  # Resumes 應用的 "new" 路徑
]

# blog/urls.py
urlpatterns = [
    path("new/", views.new, name='new'),  # Blog 應用的 "new" 路徑
]

如果模板中使用 {% url 'new' %},Django 無法判斷應該匹配哪個路徑,從而引發錯誤。

解決方法:設置命名空間

可以為每個應用設置命名空間,讓路徑名稱變得唯一且可區分:

在 resumes/urls.py 中:

from django.urls import path
from . import views

app_name = 'resumes'  # 定義 Resumes 應用的命名空間

urlpatterns = [
    path("", views.home),
    path("new/", views.new, name='new')  # 路徑名稱依然為 "new"
]

在 blog/urls.py 中:

from django.urls import path
from . import views

app_name = 'blog'  # 定義 Blog 應用的命名空間

urlpatterns = [
    path("", views.home),
    path("new/", views.new, name='new')
]

模板中使用命名空間

設置命名空間後,在模板中需要明確指定應用的命名空間,例如:

<!-- 引用 Resumes 應用的 "new" 路徑 -->
<a href="{% url 'resumes:new' %}">新增 resume</a>

<!-- 引用 Blog 應用的 "new" 路徑 -->
<a href="{% url 'blog:new' %}">新增文章</a>

命名空間的優勢

  1. 避免命名衝突:即使多個應用中使用相同的路徑名稱,命名空間確保了唯一性。
  2. 代碼結構清晰:通過命名空間,能夠快速識別路徑所屬的應用。
  3. 更易擴展:在多應用項目中,每個應用的路徑都能保持自洽,減少修改時的影響範圍。

延伸閱讀:Django URL 命名空間錯誤解決指南


5. 整體目錄結構更新

整合命名空間與模板後,目錄結構如下:

mysite/
│
├── manage.py
├── mysite/
│   ├── settings.py
│   ├── urls.py         # 主應用路由
│
├── resumes/
│   ├── __init__.py
│   ├── views.py        # 定義 home 和 new 視圖
│   ├── urls.py         # 包含命名空間 "resumes"
│   ├── templates/
│       ├── resumes/
│           ├── home.html  # 使用命名空間的模板文件
├── blog/
│   ├── __init__.py
│   ├── views.py        # 定義 blog 視圖
│   ├── urls.py         # 包含命名空間 "blog"
│   ├── templates/
│       ├── blog/
│           ├── home.html  # Blog 的模板文件

小結

  1. 推薦模組引用方式:使用 from . import views 簡化維護,減少模組引用的重複代碼。
  2. 使用 name 動態生成路徑:實現方式:path("new/", views.new, name='resume_new'),模板中用 {% url 'resume_new' %} 動態生成。
  3. 設置命名空間:
    • 通過 app_name 避免路徑名稱衝突,例如 resumes:new 和 blog:new。
    • 確保多應用專案中路徑管理清晰且一致。

通過這些技巧,Django URL 的管理將更加靈活、結構化,特別是在多應用專案中,能顯著提升代碼的可讀性與可維護性。

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 項目目錄結構示意圖
  • 設置應用的 URL 路徑
  • 推薦的模組引用方式
  • 使用 name 參數為路徑命名
  • name 的作用與實際應用
  • 使用命名空間(Namespace)避免路徑名稱衝突
  • 命名衝突問題
  • 解決方法:設置命名空間
  • 模板中使用命名空間
  • 命名空間的優勢
  • 5. 整體目錄結構更新
  • 小結