Django URL配置与页面跳转:从GET参数到正则路径及reverse重定向

沈亦白
沈亦白
发布时间:2026-10-13| 3人浏览过
原创

本文详细介绍Django中URL配置的两种常见方式:通过GET参数传递数据和使用正则表达式捕获路径参数。重点讲解如何利用name属性结合reverse函数实现URL的动态获取与页面跳转,确保在URL规则变更时模板和视图无需硬编码修改,提升代码可维护性。

Django项目与应用初始化

首先,需要创建Django项目及应用。


django-admin startproject zqxt_views(项目名)
cd zqxt_views
python manage.py startapp calc(应用名)

基于GET参数的URL配置

第一种方式是通过GET请求传递参数,例如访问 /add?a=4&b=5。

接下来,修改 calc/views.py 文件以处理该请求。


from django.shortcuts import render
from django.http import HttpResponse

def add(request):
 a = request.GET['a']
 b = request.GET['b']
 c = int(a)+int(b)
 return HttpResponse(str(c))

同时,需修改 zqxt_views/urls.py 文件,添加对应的URL路由以映射刚才创建的视图函数。


from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views

urlpatterns = [
 url(r'^add/$', calc_views.add, name='add'), # 注意修改了这一行
 url(r'^admin/', admin.site.urls),
]

启动Django服务器并进行访问测试。


python manage.py runserver 8003

在浏览器中打开指定的URL地址。


http://127.0.0.1:8003/add/?a=4&b=5

基于正则路径的URL配置

第二种方式是通过类似 /add/3/4 的路径结构传递参数。

在 calc/views.py 文件中,定义一个新的视图函数 add2。


def add2(request, a, b):
 c = int(a) + int(b)
 return HttpResponse(str(c))

随后,修改 zqxt_views/urls.py 文件,添加新的URL配置。

配置代码为 url(r'^add/(\d+)/(\d+)/$',calc_views.add2,name='add2'),。

在URL模式中,(\d+) 是正则表达式,其中 \d 代表数字,+ 代表一个或多个前导字符。组合使用 \d+ 表示匹配一个或多个数字。括号的作用是将匹配内容保存为子组,每个子组将作为参数传递给 views.py 中对应的视图函数。

访问 http://127.0.0.1:8003/add/4/5/ 即可看到与之前相同的结果,但此时URL结构更加简洁优雅。

打开 zqxt_views/urls.py 文件查看配置。


from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views

urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^add/$',calc_views.add,name='add'),
 url(r'^add/(\d+)/(\d+)/$',calc_views.add2,name='add2'),
]

URL name与reverse函数的应用

在 url(r'^add/$',calc_views.add,name='add'), 中,name='add' 参数的作用是什么?

简单来说,name 用于在 templates、models 和 views 等模块中获取对应的URL地址。这相当于为URL分配了一个别名,只要名称保持不变,即使底层URL规则发生变化,仍可通过名称动态获取正确的URL。

为了进一步阐明这一机制,我们先创建一个首页视图及其对应的URL配置。

修改 calc/views.py 文件。


from django.http import HttpResponse
from django.shortcuts import render


def index(request):
 return render(request, 'home.html')

render 函数用于渲染HTML模板。

将 'calc' 应用添加到 zqxt_views/settings.py 的 INSTALLED_APPS 列表中。


INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',

 'calc',
]

这样配置后,使用 render 渲染模板时,Django 会自动在 INSTALLED_APPS 列出的各个应用的 templates 目录中查找对应的模板文件。

注意:当 DEBUG=True 时,Django 能够自动加载各个应用 static 目录下的静态资源(如 js、css、图片等)。

在 calc 应用中新建一个 templates 文件夹,并在其中创建 home.html 文件。

在 calc/templates/home.html 文件中写入以下HTML代码。


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>title</title>
</head>
<body>
 <a href="/add/4/5" rel="external nofollow" >计算 4 + 5 </a>
</body>
</html>

修改 zqxt_views/urls.py 文件以注册首页路由。


urlpatterns = [
 url(r'^$', calc_views.index, name='home'),
 url(r'^add/$', calc_views.add, name='add'),
 url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
 url(r'^admin/', admin.site.urls),
]

运行服务器命令 python manage.py runserver 8004,然后访问 http://127.0.0.1:8004/。

URL变更与页面跳转重定向

此前计算加法使用的是 /add/4/5/ 格式。若后续需求变更,例如改为 /4_add_5/,但网页代码中多处硬编码了 /add/4/5/(例如模板中的链接),这将导致问题。


<a href="/add/4/5/" rel="external nofollow" rel="external nofollow" >计算 4+5</a>

如果直接硬编码URL,一旦修改URL正则规则,所有使用了该URL的模板(templates)、视图(views.py,如用于跳转逻辑)和模型(models.py,如记录访问地址)都必须手动修改。这种修改成本高且容易遗漏,导致部分功能失效。

reverse 函数接收 URL 配置中的 name 作为第一个参数,从而在代码中动态获取对应的URL地址。

在终端中输入 python manage.py shell 进入交互环境进行测试。


>>> from django.core.urlresolvers import reverse # django 1.4.x - django 1.10.x

或者使用其他等效的交互方式。


>>> from django.urls import reverse # Django 1.10.x - Django 2.x 新的,更加规范了

>>> reverse('add2', args=(4,5))
u'/add/4/5/'
>>> reverse('add2', args=(444,555))
u'/add/444/555/'

在网页模板中同样可以方便地使用 reverse 机制。


不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}

因此,我们将 templates/home.html 中的硬编码链接替换为动态生成方式。


<a href="/add/4/5/" rel="external nofollow" rel="external nofollow" >link</a>改成
<a href="{% url 'add2' 4 5 %}" rel="external nofollow" >link</a>

这样,当 urls.py 中的URL规则发生更改(前提是不修改 name 参数,该参数设定后应避免随意更改)时,获取的URL会动态更新。例如,将正则规则改为新形式。


url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

模板中的 {% url 'add2' 4 5 %} 将被渲染为 /new_add/4/5/。

另一种常见场景是:如果用户收藏了旧URL,而该URL已废弃并指向新地址,如何实现从旧URL /add/3/4 自动跳转到新URL?

具体的实现思路是在 view.py 中编写一个重定向视图函数。


from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

def old_add2_redirect(request, a, b):
 return HttpResponseRedirect(
 reverse('add2', args=(a, b))
 )

以上关于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 算法库。