(五)总路由、应用路由与反向地址
# 项目文件:reading_project/src/reading_site/urls.py
# 项目路由把后台交给 admin,把书架路径继续交给 library 的 URL 配置。
from django.contrib import admin
from django.contrib.auth.views import LoginView, LogoutView
from django.urls import include, path
from library.views import signup
urlpatterns = [
path("admin/", admin.site.urls),
path("accounts/signup/", signup, name="signup"),
path("accounts/login/", LoginView.as_view(), name="login"),
path("accounts/logout/", LogoutView.as_view(), name="logout"),
path("", include("library.urls")),
]
handler403 = "library.views.error_page"include 把已匹配前缀之后的路径交给另一份 URL 表。两个 accounts/ 入口调用 Django 自带的登录与退出视图,admin/ 接管理后台,阅读页面交给 library.urls。as_view() 将视图类转换为 URL 表可以调用的入口。
# 项目文件:reading_project/src/library/urls.py
# 应用路由使用统一命名空间,模板和视图可通过名称生成对应网址。
from django.urls import path
from . import views
app_name = "library"
urlpatterns = [
path("", views.index, name="index"),
path("books/new/", views.create, name="create"),
path("books/<int:pk>/", views.detail, name="detail"),
path("books/<int:pk>/edit/", views.edit, name="edit"),
path("books/<int:pk>/delete/", views.delete, name="delete"),
path("api/books/", views.api_books, name="api"),
path("export.csv", views.export_books, name="export"),
]app_name="library" 给阅读端点一个命名空间。视图中 redirect("library:detail", pk=3)、模板中 {% url 'library:detail' 3 %} 都按同一条命名规则生成 /books/3/。<int:pk> 把对应路径段转为整数。
本章页面路径保留末尾斜杠,链接由反向路由生成。redirect 默认返回 302;浏览器在这些表单成功流程中继续 GET 目标页面。前两章显式选择了 303,本章使用 Django 的默认跳转,Network 面板会显示这里实际返回的 302。