Django URL配置与页面跳转:从GET参数到正则路径及reverse重定向
本文详细介绍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配置及页面跳转的方法即为全部内容,希望能为读者提供参考。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









