Django 命名 URL 与反向解析详解:实现 URL 解耦与动态参数传递

蓝鲸
蓝鲸
发布时间:2026-10-13| 6人浏览过
原创

本文详解 Django 中命名 URL 与反向解析机制,通过对比硬编码路径与 {% url %} 模板标签,展示如何解耦视图与模板。同时涵盖 views.py 中 reverse 函数的使用,以及带位置参数和关键字参数的动态 URL 生成与重定向方法,帮助开发者构建可维护的 Django 应用。

Django 命名 URL 基础与模板反向解析

在 Django 开发中,为 URL 配置名称是基础操作。

首先查看前端模板文件 test.html 的内容。


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>测试页面</title>
</head>
<body>
<p>测试页面</p>
<form action="/test/" method="post">
 <input type="text" name="username" value="">
 <input type="submit" name="提交">
</form>
<a href="/json_test/" rel="external nofollow" >json 数据</a> 
</body>
</html>

接着查看 urls.py 中的路由配置代码。


from django.conf.urls import url
from app01 import views
urlpatterns = [
 url(r'^test/', views.test),
 url(r'^json_test/', views.json_test),
]

若直接硬编码路径,当 urls.py 中 json_test/ 的路由规则发生变更时,test.html 中的链接地址也必须同步手动修改,这增加了维护成本。

为了避免这种耦合,可以采用反向 URL 解析技术,为 json_test/ 路由分配一个唯一的别名(name)。

修改后的 urls.py 配置如下。


from django.conf.urls import url
from app01 import views
urlpatterns = [
 url(r'^test/', views.test),
 url(r'^json_test/', views.json_test, name="json"), # 给该 url 匹配命名为 json
]

对应的 test.html 模板使用 {% url %} 标签引用该别名。


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>测试页面</title>
</head>
<body> 
<p>测试页面</p> 
<form action="/test/" method="post">
 <input type="text" name="username" value="">
 <input type="submit" name="提交">
</form> 
<a href="{% url 'json' %}" rel="external nofollow" >json 数据</a> 
</body>
</html>

此时,即便后续修改 urls.py 中 json_test/ 的具体路径字符串,test.html 无需任何改动,反向解析会自动生成新的正确路径。

视图函数中的反向解析与重定向

接下来介绍如何在视图函数中进行反向解析。

若需在 views.py 中实现页面重定向,可调用 reverse 函数获取完整路径。


from django.shortcuts import render, redirect
from django.urls import reverse 
# json 测试
def json_test(request):
 hobby = ["Music", "Movie", "Basketball", "Reading"]
 from django.http import HttpResponse, JsonResponse
 return JsonResponse(hobby, safe=False) 
def test(request):
 return redirect(reverse("json")) # 通过 json 反向得到路径 json_test/

例如,访问 http://127.0.0.1:8000/test/ 时,视图函数会将用户重定向至 http://127.0.0.1:8000/json_test/。

带参数的 URL 反向解析实战

如果路由配置中包含参数,反向解析过程需额外处理这些参数。

带有参数的 urls.py 配置示例如下。


from django.conf.urls import url
from app01 import views
urlpatterns = [
 url(r'^test/', views.test),
 url(r'^json_test/(?P<id>[0-9]{2,4})/(?P<title>[a-zA-Z]+)/', views.json_test, name="json"),
]

在 test.html 中,通过 {% url %} 标签传递具体参数值。


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>测试页面</title>
</head>
<body>
<p>测试页面</p>
<form action="/test/" method="post">
 <input type="text" name="username" value="">
 <input type="submit" name="提交">
</form>
<a href="{% url 'json' 12 'abcd' %}" rel="external nofollow" >json 数据</a>
</body>
</html>

用户访问 http://127.0.0.1:8000/test/。

点击页面上的 “json 数据” 链接。

当反向解析需要传递参数时,视图函数中的写法有所不同。

包含参数捕获组的 urls.py 配置如下。


from django.conf.urls import url, include
from app01 import views
urlpatterns = [
 url(r'^test/', views.test),
 url(r'^json_test/(?P<id>[0-9]{2,4})/(?P<title>[a-zA-Z]+)/', views.json_test, name="json"),
]

在 views.py 中,通过 reverse 函数并传入 kwargs 字典来指定参数值。


from django.shortcuts import HttpResponse, redirect
from django.urls import reverse 
def json_test(request, id, title):
 print("id: ", id)
 print("title: ", title)
 return HttpResponse(id+"----"+title) 
def test(request):
 return redirect(reverse("json", kwargs={"id": 23, "title": "aaaa"}))

访问 http://127.0.0.1:8000/test/。

页面成功跳转至 http://127.0.0.1:8000/json_test/23/aaaa/。

以上即为 Django 命名 URL 与反向解析的核心内容,希望能为您的开发工作提供参考与支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。