02_Django路由Router

二、Django路由Router

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

re_path正则路由的写法
# re_path正则写法 ()表示正则分组为一个参数 (?P<参数名>regex)
re_path(r'^user_view_ab/(?P<a>\d+)/(?P<b>\d+)/$', user_view_ab, name="user_view_ab")

这样就是匹配user_view_ab/1/2等数字参数

路由匹配
# 使用url给视图函数传参数
path('index/', index)
path('detail/<int:id>/', detail)# 给url取别名,那么在使用此url的地方(例如页面模板反向解析)可以使用别名。比如:
path('index/',index,name='index')
path('detail/<int:id>/', detail, name='detail')根据路由的name属性,获取路由url
reverse('index') => 路由'index/'
反向解析

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

# 在视图函数中,反向解析url:
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'%}
页面之间相互跳转(通过html)
  1. 在根目录下的urls.py添加如下代码
from django.contrib import admin
from django.urls import include, path
from App.views import *
urlpatterns = [# 使用子路由: path("user/", include("App.urls")),# 使用子路由: 使用命名空间path("user/", include(("App.urls","App"), namespace="App")),path('admin/', admin.site.urls),
]
  1. App/urls.py子路由文件
from tkinter.font import names
from django.urls import path
from App.views import *
urlpatterns = [# 首页path('index/', index, name='index'),# 用户列表path('user_list/', user_list, name='user_list'),
]
  1. 定义视图函数user_list.html文件
# 用户列表
def user_list(request):return render(request, 'user_list.html')
  1. 在想要添加跳转链接的页面(这里只使用后端的Django跳转方式,不使用前端超链接)添加代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Index</title></head><body><h2>首页</h2><hr />{% comment %} url路由来跳转 {% endcomment %}<a href="/user/user_list/">url路由跳转: 进入用户列表</a><hr />{% comment %} 反向解析来跳转 {% endcomment %}<a href="{% url 'user_list' %}">反向解析跳转: 进入用户列表</a>user_list是路由路径的name值url 是Django的模板,用于生成url<hr />{% comment %} 带命名空间的反向解析 {% endcomment %}<a href="{% url 'App:user_list' %}">带命名空间的反向解析: 进入用户列表</a></body>
</html>
  • url路由跳转方式: 链接路径为 127.0.0.1:8000后面的内容
  • 反向解析来跳转: 反向解析就是从 html页面(点击) -> 找到路由 -> 找到视图函数(user_list是路由路径的name值)
  • 带命名空间的反向解析: 命名空间就是根/urls.py文件include方法中指定的namespace,命名空间就是为了使不同的应用之间可以使用相同的子路由路径名(例如上面的user_list)
路由传参(单个参数)

App的子路由中新增以下路由规则

# 详情页 <> 号内为参数传给user_detail视图函数
path('user_detail/<int:uid>/', user_detail, name='user_detail'),

定义视图函数user_detail

# 用户列表
def user_list(request):# 获取所有用户数据users = UserModel.objects.all()return render(request, 'user_list.html',{"users":users})
def user_detail(request,uid): # uid从路由参数中获取# print("uid",uid)# 获取单个用户数据user = UserModel.objects.get(pk=uid)    # pk是主键primary keyreturn render(request, 'user_detail.html',{"user":user})  # 传递参数到模板中

在user_list.html文件中接收user_list传过来的users参数,遍历(利用模板语法添加li>a标签)

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>用户列表</title><style>a {text-decoration: none;}</style></head><body><h2>用户列表</h2><hr /><ul>{% for user in users %} {% comment %} 反向解析 {% endcomment %}<li><a href="{%url 'App:user_detail' user.id%}">{{user.name}} - {{user.age}}</a></li>{% endfor %}</ul></body>
</html>

所以,最终生成的a标签变成了<a href="/user/user_detail/1/">张三 - 19</a>

整个过程就是按顺序发生

  • 首先用户访问user/user_list.html界面,程序调用视图函数获取所有用户列表并传参
  • user_list函数中,程序渲染本地的user_list.html返回,在渲染的过程中,将uset_list()中获取的用户列表逐个渲染成具体的链接
  • 这是对模板语法的解释
  • url 代表当前界面的url, App:user_detail表示到根路由path("user/", include(("App.urls","App"), namespace="App"))中在逐层(include(("App.urls","App"),从应用App的urls.py子路由文件)找到名为user_detail的路由项
  • 找到如下所示path('user_detail/<int:uid>/', user_detail, name='user_detail')
  • 然后user.id就是把id属性传给路由参数,相对于变成``path(‘user_detail/user.id/’, user_detail, name=‘user_detail’)`
路由参数支持的类型

Django支持多种类型的路由参数,常见的有:

  1. int:接收整数,如 <int:user_id>
  2. str:接收字符串,如 <str:username>
  3. slug:接收短横线连接的字符串,如 <slug:slug>
  4. uuid:接收UUID,如 <uuid:uuid>
  5. path:接收包含斜杠的字符串,如 <path:subpath>
路由传参(多参数)

视图函数

def user_view_ab(request,a,b):return HttpResponse(f"a={a},b={b}")

子路由

# 带参数的视图函数,注意,参数的名字必须和视图函数中参数的名字一致
path("user_view_ab/<int:a>/<int:b>/", user_view_ab, name="user_view_ab")

注意!!! 参数名称要对应

重定向redirect函数

在视图函数中,可以重定向到别的网页或者路径

path('user_detail/<int:a>/',user_detail,name='userdetail'),def user_detail(a):return HttpResponse("user_detail")
# 重定向
def my_redirect(request):return redirect('http://www.baidu.com')def my_redirect2(request):return redirect('/user/user_list/')def my_redirect3(request):# reverse反向解析(根据路由name属性找到对应url)return redirect(reverse('user_list')) # 相当于  return redirect(/user/user_list/)return redirect(reverse('App:userdetail', args=(1,))) # 传参给path('user_detail/<int:a>/',user_detail,name='userdetail'),args=元组或列表,kawrgs=字典return redirect(reverse('App:userdetail', kwargs={'a':2}))

在子路由中增加重定向部分

# 用户列表(原有)
path('user_list/', user_list, name='user_list'),
path('user_detail/<int:a>/',user_detail,name='userdetail'),
# 重定向
path('myredirect/', my_redirect),
path('myredirect2/', my_redirect2),
path('myredirect3/', my_redirect3),

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

110页PPT战略指南:剖析Cross SWOT分析、市场洞察与内部优化方案

您看到的是一个非常全面的通过Cross SWOT制定战略方案的框架。以下是对每个部分的简要解释和补充&#xff0c;以帮助您更好地理解和应用这个框架&#xff1a; 一、通过Cross SWOT制定战略方案 1. 宏观环境 (1) PEST分析&#xff1a;评估政治&#xff08;Political&#xff0…

ArcGIS 软件中路网数据的制作

内容导读 路网数据是进行网络分析的基础&#xff0c;它是建立网络数据集的数据来源。 本文我们以OSM路网数据为例&#xff0c;详细介绍OSM路网数据从下载&#xff0c;到数据处理&#xff0c;添加属性&#xff0c;完成符合网络分析的网络数据集的全部过程。 01 数据获取 比较…

JMeter实时性能压测可视化系统整合

一、相关工具简介: JMeter、Grafana 和 InfluxDB 结合实时地收集、分析和展示性能测试数据,进行更好地理解系统的性能表现,及时发现潜在问题并进行优化。 1,JMeter 实时生成性能数据,并将其发送到 InfluxDB 进行存储。2,InfluxDB 存储的数据。3,通过Grafana的仪表板,用…

数据结构——排序第三幕(深究快排(非递归实现)、快排的优化、内省排序,排序总结)超详细!!!!

文章目录 前言一、非递归实现快排二、快排的优化版本三、内省排序四、排序算法复杂度以及稳定性的分析总结 前言 继上一篇博客基于递归的方式学习了快速排序和归并排序 今天我们来深究快速排序&#xff0c;使用栈的数据结构非递归实现快排&#xff0c;优化快排&#xff08;三路…

YOLOv9改进,YOLOv9引入CAS-ViT(卷积加自注意力视觉变压器)中AdditiveBlock模块,二次创新RepNCSPELAN4结构

摘要 CAS-ViT 是一种为高效移动应用设计的视觉Transformer。模型通过结合卷积操作与加性自注意机制,在保持高性能的同时显著减少计算开销,适合资源受限的设备如手机。其核心组件 AdditiveBlock 通过多维度信息交互和简化的加性相似函数,实现了高效的上下文信息整合,避免了…

【Leecode】Leecode刷题之路第62天之不同路径

题目出处 62-不同路径-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 62-不同路径-官方解法 方法1&#xff1a;动态规划 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&…

PostgreSQL在Linux环境下的常用命令总结

标题 登录PgSQL库表基本操作命令新建库表修改库表修改数据库名称&#xff1a;修改表名称修改表字段信息 删除库表pgsql删除正在使用的数据库 须知&#xff1a; 以下所有命令我都在Linux环境中执行验证过&#xff0c;大家放心食用&#xff0c;其中的实际名称换成自己的实际名称即…

分布式协同 - 分布式锁一二事儿

文章目录 导图Pre概述概述1. 分布式互斥和临界资源的协调2. 分布式锁的基本原理3. 分布式锁的实现方式a. 基于数据库实现的分布式锁b. 基于Redis实现的分布式锁c. 基于Zookeeper实现的分布式锁 4. 高并发场景下的分布式锁优化a. 分段锁&#xff08;Sharded Locks&#xff09;b.…

FFmpeg 简介与编译

1. ffmpeg 简介&#xff1a; FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移…

Ubuntu-20.04安装 terminator

Ubuntu-20.04安装 terminator sudo apt install terminator 安装成功之后&#xff0c;在ubuntu终端里执行命令 terminator & terminator 窗口分割 基本操作 1. 创建新终端 水平分割&#xff1a;按下 Ctrl Shift E 创建一个新的水平分屏。 垂直分割&#xff1a;按下 Ct…

(已解决)wps无法加载此加载项程序mathpage.wll

今天&#xff0c;在安装Mathtype的时候遇到了点问题&#xff0c;如图所示 尝试了网上的方法&#xff0c;将C:\Users\Liai_\AppData\Roaming\Microsoft\Word\STARTUP路径中的替换为32位的Mathtype加载项。但此时&#xff0c;word又出现了问题 后来知道了&#xff0c;这是因为64位…

shell第二次作业

1. 使用case实现成绩优良差的判断 read -p "请输入你的成绩&#xff1a;" score if ! [[ "$score" ~ ^[0-9]$ ]];then echo "请输入数字" exit 1 fi if [ "$score" -lt 0 ] || [ "$score" -gt 100 ];then echo …

Appflyer记录卸载事件

Appflyer官方文档 1.原理 1.AppsFlyer每天向Firebase Cloud Messaging&#xff08;FCM&#xff09;和 Apple Push Notification Services&#xff08;APNS&#xff09;发送一次API请求。 2.然后FCM和APNS会发送一条静默推送消息&#xff0c;用于判断用户设备上是否仍装有相关应…

【81-90期】Java核心面试问题深度解析:性能优化与高并发设计

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 文章题目&#xff1a;Java核心面试问题深度解析&#xff1a;性能优化与高并发设计 摘要&#xff1a; 本文聚…

“移门缓冲支架:为家庭安全加码”

在智能家居日益普及的今天&#xff0c;科技不仅改变了我们的生活方式&#xff0c;也提升了家居的安全。移门缓冲支架作为一项结合了现代技术的小型装置&#xff0c;正逐渐成为提升家庭安全的重要配件。它通过吸收门关闭时的冲击力、减缓关门速度以及减少噪音等多重功能&#xf…

vue element-ui的el-image 和 el-table冲突层级冲突问题问题preview-teleported

问题: 解决代码:preview-teleported <el-image style"width: 50px; height: 50px" :src"props.row.url" :zoom-rate"1.2" :max-scale"7":min-scale"0.2" :preview-src-list"[props.row.url]" :initial-index&…

VR云展让企业实现产品的多样展示

随着科技的飞速进步&#xff0c;各行各业的企业正经历着前所未有的快速发展&#xff0c;企业形象的升级变得尤为重要。在此背景下&#xff0c;VR线上展厅以其独特的沉浸式3D体验脱颖而出&#xff0c;近年来赢得了广泛关注与认可。该模式已广泛应用于企业、展会机构、市政单位等…

强化安全责任意识,传音开展第四届信息及隐私安全文化宣传周活动

为了让信息及隐私安全责任意识深入每一位员工心中&#xff0c;传音连续多年开展信息及隐私安全文化宣传活动。11月4日至15日&#xff0c;传音控股第四届信息及隐私安全文化宣传周活动&#xff08;以下简称“传音安全周”&#xff09;在重庆、深圳、上海、南昌及海外多个国家地区…

人工智能的微积分基础

目录 ​编辑 引言 微积分的基本概念 1. 导数 2. 积分 3. 微分方程 微积分在人工智能中的应用 1. 机器学习中的优化 2. 反向传播算法 3. 概率与统计 4. 控制理论 5. 自然语言处理中的梯度 6. 计算机视觉中的积分 7. 优化算法中的微积分 8. 微分几何在深度学习中的…

canal同步数据教程

canal简介 官网&#xff1a;https://github.com/alibaba/canal 主要是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费&#xff0c;是一个实时同步的方案。 基于日志增量订阅和消费的业务包括 数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、…