Django-2-路由

一、子路由

在前面的入门中,已经使用了路由了,当时的路由只是直接使用视图函数而已。也是路由的一种。
还有一种方式,那就是子路由。

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-2-路由
image.png

二、路由

在项目开发中,一个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模块下添加

Django-2-路由
image.png


在models.py中添加如下代码


class StudentModel(models.Model):
    name = models.CharField(max_length=50)
    age = models.PositiveIntegerField()  # 年龄是正数

# 切记创建了模型,一定要数据迁移

数据迁移

Django-2-路由
image.png


查看数据库中内容

Django-2-路由
image.png


先手动添加一些数据。


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),
]
Django-2-路由
image.png

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),
]
Django-2-路由
image.png

四、路由传递多个参数

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!