Django 命名 URL 与反向解析详解:实现 URL 解耦与动态参数传递
本文详解 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 与反向解析的核心内容,希望能为您的开发工作提供参考与支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









