Django路由Router

news2024/11/25 22:35:57

文章目录

  • 一、路由router
    • 路由匹配
    • 命名空间
    • 反向解析
  • 二、实践
    • 创建用户模型Model
    • 添加子路由 - 创建用户首页
    • 页面跳转 - 使用反向解析和命名空间
      • 1. 不使用命名空间的效果
      • 2. 使用命名空间的效果
    • 用户详情页面跳转 - 路由传参
    • 路由传递多个参数
    • re_path 以前写法,了解即可
    • 重定向Redirect
      • 1. 重定向别的地址
      • 2.重定向到自己路由(带参数)
      • 3.重定向 反向解析: 位置参数传参
      • 4. 重定向 反向解析:关键字传参


一、路由router

在实际开发过程中,一个Djaqgo 项目会包含很多的 app,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个app 里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发。

路由匹配

# 使用ur1给视图函数传参数
path('index/', index)
path('detail/<int:id>/', detail)

# 给ur1取别名,那么在使用此ur1的地方可以使用别名。比如:
path('index/', index, name='index')
path('detail/<int:id>/', detail, name='detail')

<int:id> 整数
<str:id> 字符串

命名空间

在实际应用中,Diango中可能存在多个应用程序,每个应用程序都可能有自己的路由模块。为了防止路由冲突,Django提供了命名空间(namespace)的概念。命名空间是一种将路由命名为层次结构的方式,使得在查询路由时可以限定在该命名空间内。

# 在根路由中可以设置命名空间
	path('app/', include(('App.urls',"App",namespace='App')

反向解析

Django路由反向解析是一个非常重要的功能,它可以让我们在代码中使用路由别名替代URL路径,在修改URL时避免代码中的硬编码依赖,同时也可以提高可读性和可维护性。

  • redirect 叫重定向
    • 我们在做跳转的时候,其实就是做一个页面跳转,在我们后台相当于是一个视图函数之间的跳转,从这个视图函数直接跳到另一个视图函数
  • reverse 是反向解析
    • reverse(路由name) 得到的是name所对应的路由路径 (字符串)。
    • reverse( ‘index’)   ==>   ‘index/’
    • redirect(reverse( ‘index’))   相当于==>   redirect( ‘index/’ )   也是可以跳转的。
    • args=    位置传参
    • kwargs=    关键字参数传参
# 在视图函数中,反向解析ur1:
	from django.shortcuts import render,redirect,reverse
	def buy(request):
		return redirect(reverse( 'index')) # 重定向
		return redirect(reverse( 'detail',args=[2])) # 重定向 参数传递
		return redirect(reverse('detail', kwargs={"id": 2})) # 重定向 关键字传参

# 在templates中,使用别名
	{% url 'detail' stu.id %)

# 使用命名空间:
# 指定命令空间后,使用反向解析时需要加上命名空间,比如:
# 1.在视图函数中:
		return redirect(reverse('App:index'))
# 2.在templates中:
	{% url 'App:index' %}
	{% url 'App:detail' 2 %}

如果用了命名空间,后面的反向解析(包括视图函数和模板中)都要使用命名空间

二、实践

新建一个新项目Day02MyDjangoPro01

创建用户模型Model

App\models.py

from django.db import models


class UserModel(models.Model):
    name = models.CharField(max_length=30)
    age = models.PositiveIntegerField()  # 非负数

生成迁移文件: python manage.py makemigrations
执行迁移: python manage.py migrate

数据库:添加几条数据
在这里插入图片描述

添加子路由 - 创建用户首页

App\urls.py

from django.urls import path
from App.views import *

urlpatterns = [
    path('index/', index),  # 首页

]

App\templates\index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h2>首页</h2>
    <hr>

</body>
</html>

App\views.py

from django.shortcuts import render


def index(request):
    return render(request, "index.html")

根路由 Day02MyDjangoPro01\urls.py

from django.contrib import admin
from django.urls import path, include

# from App.views import *


urlpatterns = [
    path('admin/', admin.site.urls),

    # 1. 直接使用根路由
    # path('user/', index),
    # 2.使用子路由: 使用include
    # path('user/', include('App.urls')),
    # 3.使用子路由: 使用include, 命名空间namespace
    path('user/', include(('App.urls', 'App'), namespace='App')),

]

http://127.0.0.1:8000/user/index/

在这里插入图片描述

页面跳转 - 使用反向解析和命名空间

App\templates\user_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
    <h2>用户列表</h2>
    <hr>
</body>
</html>

App\views.py 创建视图函数user_list

from django.shortcuts import render


# 首页
def index(request):
    return render(request, "index.html")


# 用户列表
def user_list(request):
    return render(request, "user_list.html")

App\urls.py 写一个路由

from django.urls import path
from App.views import *

urlpatterns = [
    path('index/', index),  # 首页
    path('user_list/', user_list, name='user_list')  # 用户列表
]

在这里插入图片描述

需求:在index页面跳转到user_list页面

1. 不使用命名空间的效果

根路由 Day02MyDjangoPro01\urls.py

在这里插入图片描述
App\templates\index.html

反向解析 {% url '定义路由后面name的名字' %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h2>首页</h2>
    <hr>
    {#  url路由跳转  #}
    <a href="/user/user_list/">点击url路由的方式:进入用户列表的页面</a>
    <br>
    {#  反向解析 {% url '定义路由后面name的名字' %} #}
        {#  user_list 是path路由的name值  #}
    <a href="{% url 'user_list' %}">反向解析的方式:进入用户列表的页面</a>
    <br>

</body>
</html>

点击是可以跳转的

在这里插入图片描述

2. 使用命名空间的效果

根路由 Day02MyDjangoPro01\urls.py

在这里插入图片描述

App\templates\index.html

反向解析:带命名空间 {% url '命名空间的名称:定义路由后面name的名字' %}。namespace你可以理解为 一个子路由有一个命名空间。

这样做有什么用?一个命名空间表示一个应用,我们在写代码的时候,如果我们在不同应用中取相同name的话,那么可以通过应用空间namespace去区分他们。

如果是用子路由,就建议使用命名空间!!!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h2>首页</h2>
    <hr>
    {#  url路由跳转  #}
    <a href="/user/user_list/">点击url路由的方式:进入用户列表的页面</a>
    <br>
    
    {#  反向解析 {% url '定义路由后面name的名字' %} #}
        {#  user_list 是path路由的name值  #}
{#    <a href="{% url 'user_list' %}">反向解析的方式:进入用户列表的页面</a>#}
    <br>
    
    {#  反向解析:带命名空间 {% url '命名空间的名称:定义路由后面name的名字' %} #}
    <a href="{% url 'App:user_list' %}">反向解析带命名空间的方式:进入用户列表的页面</a>
</body>
</html>

点击是可以跳转的

在这里插入图片描述

用户详情页面跳转 - 路由传参

App\views.py ,user_list 传参、用户详情

from django.shortcuts import render
from App.models import *


# 首页
def index(request):
    return render(request, "index.html")


# 用户列表
def user_list(request):
    # 获取所有用户数据
    users = UserModel.objects.all()
    return render(request, "user_list.html", {"users": users})


# 用户详情
def user_detail(request, uid):
    # print("uid:", uid)
    user = UserModel.objects.get(pk=uid)  # pk:primary key主键
    return render(request, "user_detail.html", {'user': user})

增加一个页面,用户详情页面, App\templates\user_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户详情</title>
</head>
<body>
    <h2>用户详情</h2>
    <hr>
    <p>用户的名字:{{ user.name }}</p>
    <p>用户年龄:{{ user.age }}</p>
</body>
</html>

添加路由 App\urls.py

from django.urls import path
from App.views import *

urlpatterns = [
    path('index/', index),  # 首页
    path('user_list/', user_list, name='user_list'),  # 用户列表
    path('userdetail/<int:uid>/', user_detail, name='userdetail'),  # 用户详情
]

App\templates\user_list.html ,将数据显示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
    <h2>用户列表</h2>
    <hr>
    <ul>
        {% for user in users %}
            <li>
                {#     反向解析: 路由传参           #}
                <a href="{% url 'App:userdetail' user.id %}">{{ user.name }} - {{ user.age }}</a>
            </li>
        {% endfor %}
    </ul>

</body>
</html>

在这里插入图片描述
在这里插入图片描述

路由传递多个参数

App\views.py

from django.http import HttpResponse

# 多个参数
def user_ab_view(request, a, b):
    return HttpResponse(f'a:{a} - b:{b}')

添加路由 App\urls.py

# 多个参数
path('userab/<int:a>/<int:b>/', user_ab_view, name='user_ab'),

在这里插入图片描述

但是如果我把视图函数参数顺序反过来 会怎么样呢?

在这里插入图片描述
可以看到跟视图函数a,b顺序是没有关系的,a传给a,b传给b。

我们在用的时候,要和路由中的参数名一致,名字对应赋值,你可以理解为相当于关键字参数传值,a赋给a,b赋给b。

re_path 以前写法,了解即可

re 是正则的意思

在这里插入图片描述
第一个参数 得用正则,一般前面加一个r,字符串转义,这个跟正则没有太大关系,一般会写上r。有几个参数写上几个括号() ,整个字符串'user_ba/()/()/'会当做字符去处理的,

\d表示一个数字,\d+表示它可以是数字,表示这一块接收的是整数,+的意思就是一个整数多个整数都可以,但不能为零个整数。
a表示整数的名字,?P<a>这一串其实是给它命一个名字,给这个分组命名为a。

重定向Redirect

1. 重定向别的地址

App\views.py

from django.shortcuts import render, redirect, reverse

# 重定向
def my_redirect(request):
    return redirect("https://blog.csdn.net/weixin_59633478/category_12401835.html")

添加路由 App\urls.py

path("myredirect/", my_redirect)

打开浏览器,输入http://127.0.0.1:8000/user/myredirect

在这里插入图片描述

注意:自动跳到了https://blog.csdn.net/weixin_59633478/category_12401835.html,地址改变了

2.重定向到自己路由(带参数)

App\views.py

def my_redirect(request):
    # return redirect("/user/user_list")
    return redirect("/user/userdetail/2/") # 带参数:第一种写法

3.重定向 反向解析: 位置参数传参

def my_redirect(request):
    # return redirect("/user/userdetail/2/") # 带参数:第一种写法
    # 反向解析
    return redirect(reverse("App:userdetail", args=(2,)))  
    # reverse("App:userdetail", args=(2,)) 相当于 '/user/userdetail/2/'

注意: 有命名空间一定要写命名空间,如果没有命名空间就不用写命名空间

# 不带命名空间
return redirect(reverse("userdetail", args=(2,)))  

4. 重定向 反向解析:关键字传参

def my_redirect(request):
    # 反向解析
    # return redirect(reverse("App:userdetail", args=(2,)))  

    # 反向解析: 关键字传参
    return redirect(reverse("App:userdetail", kwargs={'uid': 2}))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/865289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs+vue+elementui美食网站的设计与实现演示录像2023_0fh04

本次的毕业设计主要就是设计并开发一个美食网站软件。运用当前Google提供的nodejs 框架来实现对美食信息查询功能。当然使用的数据库是mysql。系统主要包括个人信息修改&#xff0c;对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、…

【VB6|第23期】原来Jet.OLEDB也可以读取新版.xlsx的Excel文件

日期&#xff1a;2023年8月11日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

MySQL 小测试

目录 基础查询 ​ 高级查询 基础查询 现有用户表user数据如下&#xff1a; 1、写出ddl语句创建如上表&#xff0c;插入数据&#xff0c;查询所有数据 #创建表user create table user( id int UNSIGNED auto_increment key , device_id int UNSIGNED, gender varchar…

【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字

盛水最多的容器 &#xff08;1&#xff09;暴力解法 算法思路&#xff1a;我们枚举出所有的容器大小&#xff0c;取最大值即可。 容器容积的计算方式&#xff1a; 设两指针 i , j &#xff0c;分别指向水槽板的最左端以及最右端&#xff0c;此时容器的宽度为 j - i 。由于容器…

七道Android面试题,先来简单热个身

作者&#xff1a;Coffeeee 马上就要到招(tiao)聘(cao)旺季金勾银十了&#xff0c;一批一批的社会精英在寻找自己的下一家的同时&#xff0c;也开始着手为面试做准备&#xff0c;回想起自己这些年&#xff0c;也大大小小经历过不少面试&#xff0c;有被面试过&#xff0c;也有当…

mybatis-plus的逻辑删除的坑

一旦在逻辑字段上加了TableLogic逻辑删除的配置&#xff0c;并且使用mybatis-plus自带的方法时&#xff08;如果自己用xml写SQL不会出现下面的情况&#xff09; 查询、修改时会自动排除逻辑删除的数据 当使用mybatis-plus自带的查询方法时&#xff0c;就不用每次查询的时候跟…

构建 LVS-DR 群集、配置nginx负载均衡。

目录 一、基于 CentOS 7 构建 LVS-DR 群集 1、准备四台虚拟机 2、配置负载调度器&#xff08;192.168.2.130&#xff09; 3、部署共享存储&#xff08;192.168.2.133&#xff09; 4、配置两个Web服务器&#xff08;192.168.2.131、192.168.2.132&#xff09; 测试集群 二…

【HCIP】重发布实验

题目&#xff1a; 配置&#xff1a; R1 //配置ip地址 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [r1-GigabitEthernet0/0/0]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 13.1.1.1 24 [r1-GigabitEthernet0/0/1]int lo0 [r1-LoopBack0]ip add 1.1.1.1 24 /…

天马上位在即,将成为iPhoneSE4二级供应商,SE4有望2025年量产

根据知情人士透露&#xff0c;国内OLED面板制造商&#xff0c;如天马&#xff0c;正在积极争取成为苹果iPhone SE 4的AMOLED面板供应商。 苹果面板采购负责人已经在今年上半年访问了中国大陆的主要柔性AMOLED面板制造商之一&#xff0c;这意味着国内一家OLED面板厂商有望成为iP…

哪些人会看作业指导书?作业指导书怎样才能发挥作用?

一般人普遍人为&#xff0c;作业指导书就是给操作人员看的。其实不然&#xff0c;那么哪些人会看作业指导书&#xff1f;大致可以分为: 第一类&#xff1a;新到工作岗位的员工。其中包括新进员工和新转岗位的员工&#xff0c;他们都会在师傅或领班组长的带领指导下&#xff0c;…

MySQL 数据类型总结

整形数据类型 1字节 8bit 2^8256

安灯Andon系统的应用与优势

安灯系统是一款与硬件相结合&#xff0c;实时了解机台与工位状态&#xff0c;让异常的信息得到快速、高效的解决的系统软件&#xff0c;同时记录每次异常报警的种类、响应时间和处理问题用时&#xff0c;提供改善生产管理和人员考核的数据参考&#xff0c;实现透明、快速的生产…

C++实现一键关闭桌面

方法一&#xff1a; C关闭桌面,explorer.exe #include<Windows.h> #include <TlHelp32.h> #include"resource.h" #pragma warning(disable:4996) void taskkill(const char * name) {HANDLE info_handle CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,…

C++ 派生类的拷贝构造函数

当存在类的继承关系时&#xff0c;对于一个类&#xff0c;如果程序员没有编写拷贝构造函数&#xff0c;编译系统会在必要时自动生成一个隐含的拷贝构造函数&#xff0c;这个隐含的拷贝构造函数会自动调用基类的拷贝构造函数&#xff0c;然后对派生类新增的成员对象一一执行拷贝…

更新镜像配置

安装docker Install Docker Desktop on Linux | Docker Documentation 拉取镜像 sudo docker pull reg.docker.xx-inc.com/xxx/xxxx:20220916 基于镜像运行容器 sudo docker run -it reg.docker.xx-inc.com/xx/xxxx:20230317 /bin/bash 修改配置后ctrlp&#xff0c;再ctrlq…

激光切割机的操作中蛙跳技术是什么意思

其实&#xff0c;蛙跳技术就是指在激光切割机运行的过程中&#xff0c;机器换位置的方式。打个比方&#xff0c;你刚刚在这儿把孔1切好了&#xff0c;接下来就得跑到那儿把孔2切了。 在这个过程中&#xff0c;激光切割机就像是一只青蛙&#xff0c;要从一个位置跳到另一个位置。…

#python# #Matplotlib# 常用可视化图形

工作中&#xff0c;我们经常需要将数据可视化&#xff0c;分享一些Matplotlib图的汇总&#xff0c;在数据分析与可视化中是非常有用。 如下协一些常用图形。 安装相关插件 python3 pip3 install scipy python3 pip3 install pandas python3 pip3 install matplotlib python…

【技巧】如何设置Word文档部分内容“限制编辑”?

我们知道&#xff0c;Word文档可以设置“限制编辑”&#xff0c;也就是保护文档不被随意更改。 那如果只想保护文档中的部分内容&#xff0c;其他内容还是随意编辑更改&#xff0c;是否可以设置部分内容“限制编辑”&#xff1f;答案是可以的&#xff0c;下面小编来举例说明一…

【Tomcat】Tomcat部署及优化

Tomcat 它是一个免费、开源的web应用服务器&#xff1b;基于java代码开发的软件&#xff1b;处理动态请求和基于Java代码的页面开发&#xff1b; 可以在html当中写入Java代码&#xff0c;Tomcat可以解析html页面当中的Java代码&#xff0c;执行动态请求以及动态页面 缺点&#…

静态时序分析与时序约束

一、时序分析的基本概念 1. 时钟 理性的时钟模型是一个占空比为50%且周期固定的方波&#xff1a; 实际电路中输入给FPGA的晶振时钟信号是正弦波&#xff1a; 2. 时钟抖动 Clock Jitter&#xff0c;时钟抖动&#xff0c;相对于理想时钟沿&#xff0c;实际时钟存在不随时钟存在…