一、子路由
在前面的入门中,已经使用了路由了,当时的路由只是直接使用视图函数而已。也是路由的一种。
还有一种方式,那就是子路由。
1.1 在应用中创建一个urls.py
名字叫做urls.py ,是参考项目中的urls.py的写法
在这里面写子路由。
下面例子中,定义了一个子路由,该路由属于student模块的路由,作为项目的子路由。
定义路由方式与视图一样,通过path方法实现路由。
from django.urls import path
from student.views import *
# 子路由
urlpatterns = [
path('home/', home)
]
1.2 如何使用子路由
"""
URL configuration for demo2 project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
# 导入student应用中的视图文件中所有,用于与路由url关联
from student.views import *
urlpatterns = [
# 路由,只有当url中输入ip:端口/index/的时候,这里就会拦截到,然后转换到 index函数中去处理
# 这里是直接访问的视图函数,没有使用子路由
path('index/', index),
# 子路由,可以一个应用对于一个子路由
path('student/', include('student.urls')),
path('admin/', admin.site.urls),
]
上面的注释中,已经介绍了,有3种方式来引入子路由。

二、路由
在项目开发中,一个Django 项目会包含很多的功能,如果每一个功能叫做一个模块的话,也叫做app,也就是通过python manage.py startapp 应用名称
生成的应用。
此时,如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个app ,创建各自的urls.py
路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py 模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发。
2.1 路由匹配
2.1.1 使用url给视图函数参参数
path('index/',index) # 对应上了index视图函数
path('detail/<int:id>/',detail) # 带参数的
2.1.2 给url起别名
别名的作用,可以在路由跳转时,通过别名来实现,哪怕url变化了,别名不变,避免了URL的硬编码。
path('index/',index, name='index') # 对应上了index视图函数
path('detail/<int:id>/',detail, name='detail') # 带参数的
2.2 命名空间
在项目中中,Django中可能存在多个应用程序,每个应用程序都可能有自己的路由模块。为了防止路由冲突Django提供了命名空间(namespace)的概念。
命名空间是一种将路由命名为层次结构的方式,使得在查询路由时可以限定在该命名空间内。
在根路由可以设置命名空间
path('student/',include('student.urls','student'), namespace='student')
2.3 反向解析
路由反向解析,可以让我们在代码中使用路由别名替代URL来访问路径,避免了URL的硬编码。
2.3.1 在后端用法
from django.shortcuts import render,redirect,reverse
def goDetail(request):
return redirect(reverse('detail', args=[2]))
另一种写法
def goDetail(request):
return redirect(reverse('detail', kwargs={"id":3}))
在命名空间中使用
def goDetail(request):
return redirect(reverse('student:detail', kwargs={"id":3}))
2.3.2 在模板中用法
{% url 'detail' 3 %}
带命名空间的用法
{% url 'student:detail' 3 %}
三、用法详解
3.1 先定义一个模型,并数据迁移
在项目的student模块下添加

在models.py中添加如下代码
class StudentModel(models.Model):
name = models.CharField(max_length=50)
age = models.PositiveIntegerField() # 年龄是正数
# 切记创建了模型,一定要数据迁移
数据迁移

查看数据库中内容

先手动添加一些数据。
3.2 通过根路由访问
from django.contrib import admin
from django.urls import path, include
# 导入student应用中的视图文件中所有,用于与路由url关联
from student.views import *
urlpatterns = [
# 1. 这里直接使用的是根路由,也就是直接通过student/ 就访问到了index这个视图函数
path('student/', index),
# 2. 子路由,这里需要通过根路由+子路由,访问到子路由对应的视图
# 这里就是student/index,才能访问到子路由对应的index视图函数
#path('student/', include('student.urls')),
# 3. 使用子路由,配合命名空间
#path('student/', include(('student.urls', 'student'), namespace='stu')),
path('admin/', admin.site.urls),
]

3.3 通过子路由访问
from django.contrib import admin
from django.urls import path, include
# 导入student应用中的视图文件中所有,用于与路由url关联
from student.views import *
urlpatterns = [
# 1. 这里直接使用的是根路由,也就是直接通过student/ 就访问到了index这个视图函数
#path('student/', index),
# 2. 子路由,这里需要通过根路由+子路由,访问到子路由对应的视图
# 这里就是student/index,才能访问到子路由对应的index视图函数
path('student/', include('student.urls')),
# 3. 使用子路由,配合命名空间
#path('student/', include(('student.urls', 'student'), namespace='stu')),
path('admin/', admin.site.urls),
]
子路由配置
from django.urls import path
from student.views import *
# 子路由
urlpatterns = [
path('index/', index),
]

四、路由传递多个参数
4.1 视图写法
def stu_status_view(request,userid,status):
# 这里通过userid和status来接收路由中的参数
# 写法与路由中一致即可
pass
4.2 路由写法
传统写法
path('stustatus/<int:userid>/<int:status>',stu_status_view, name='stustatus')
正则写法
re_path(r'stustatus/(?P<userid>d+)/(?P<status>d+)',stu_status_view, name='stustatus')
原文始发于微信公众号(Python之家):Django-2-路由
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198204.html