Django路由

Router介绍

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

路由匹配

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

命名空间

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

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

反向解析

Django路由反向解析是一个非常重要的功能,它可以让我们在代码中使用路由别名替代URL路径,在修改URL时避免代码中的硬编码依赖,同时也可以提高可读性和可维护性。
为什么叫反向解析呢? 正常的路由匹配,都是通过path路由规则一步一步找到.html文件。而反向解析因为有路由别名的原因,是直接从.html文件找到路由规则的

# 在视图函数中,反向解析ur1:from django.shortcuts import render,redirect,reversedef 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中:{% ur1 'App:index' %}

路由使用

创建名App的应用
App/models.py

from django.db import models# Create your models here.
class UserModels(models.Model):name=models.CharField(max_length=30)age=models.PositiveIntegerField() # 非负数

App/urls.py

from django.urls import path
from App.views import *urlpatterns=[# 首页path('index/',index)
]

urls.py

from django.contrib import admin
from django.urls import path,include
from App.views import *urlpatterns = [# 1、直接使用根路由path('user/',index),# 2、使用子路由,使用includepath('user/',include('App.urls')),# 3、使用子路由,使用include,命名空间namespace# 使用命名空间时注意,include函数有两个参数,默认第二个参数namespace为None# 当传命名空间的时候,第一个参数要是元组类型的,并且要加上App的名字,一般和应用的名字一样path('user/',include(('App.urls','App'),namespace='App')),path('admin/', admin.site.urls),
]

页面跳转

  • 当路由规则使用了命名空间,反向解析也只能使用带命名空间的方式
    创建userlist.html,使用index.html进行后端跳转
    index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><h2>首页</h2><hr>{#  1、URL路径  #}{#  当访问这个路径/user/userlist 相当于会访问后端的视图函数userlist(),来到urls.py文件对userlist的路由规则  #}<a href="/user/userlist">url路由的方式:进入用户列表页面</a><hr>{#  2、反向解析  #}{#  userlist 是path路由的name值  #}<a href="{% url 'userlist' %}">反向解析的方式:进入用户列表页面</a><hr>{#  反向解析:带命名空间  #}<a href="{% url 'App:userlist' %}">反向解析带命名空间的方式:进入用户列表页面</a>
</body>
</html>

views.py添加

# 用户列表
def usr_list(request):users=UserModels.objects.all()return render(request,'user_list.html',{'users':users})

1711462183069.png

路由传参

单个参数

创建userdetail.html

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

修改user_list.html

  • <a href="{% url 'userdetail' user.id %}">通过用户id拼接从而,当通过反向解析跳转到path匹配路径时,会将user.id 传入路由
<!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 'userdetail' user.id %}">{{ user.name }}-{{ user.age }}</a></li>{% endfor %}</ul>
</body>
</html>

views.py添加

# 用户详情
def user_detail(request,uid):print('uid:',uid)# 通过主键获取一个对象的值user=UserModels.objects.get(pk=uid) # pk: primary key 主键return render(request,'userdetail.html',{'user':user})

usrls.py

from django.urls import path
from App.views import *urlpatterns=[# 首页path('index/',index),# 用户列表path('userlist/',usr_list,name='userlist'),# 用户详情path('userdetail/<int:uid>/',user_detail,name='userdetail'),
]

1711462230195.png

多个参数

  • 要和路由中的参数名一致,名字对应赋值,理解为关键字传值
    views.py添加
# 多个参数
def user_ab_viem(request,a,b):return HttpResponse(f'a:{a}-b:{b}')
# 要和路由中的参数名一致,名字对应赋值
def user_ba_viem(request,b,a):return HttpResponse(f'a:{a}-b:{b}')

urls.py

from django.urls import path
from App.views import *urlpatterns=[# 首页path('index/',index),path('userlist/',usr_list,name='userlist'),path('userdetail/<int:uid>/',user_detail,name='userdetail'),path('userab/<int:a>/<int:b>/',user_ab_viem,name='userab'),path('userba/<int:a>/<int:b>/',user_ab_viem,name='userba'),
]

1711461604942.png
1711461590780.png

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

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

相关文章

类与对象上C++

文章目录 一、1.面向过程和面向对象初步认识二、类的定义1.类的两种定义方式 三、类的访问限定符及封装1.访问限定符2.面试题3.封装 四、类对象模型1. 类对象的存储方式猜测2. 结构体内存对齐规则 五、this指针1.this指针的引出2.this指针的特性 六、 C语言和C实现Stack的对比 …

【蓝桥杯3.23小白赛】(详解)

第一题签到题不多说 【二进制王国】 #include <iostream> #include <vector> #include <algorithm> using namespace std;//int Cmp(string s1, string s2)测试了一下时间差确实很明显&#xff0c;还是用下面的内个 int Cmp(const string &s1,const st…

如何快速进行城市内涝模拟?HTWATER软件

原文链接&#xff1a;如何快速进行城市内涝模拟&#xff1f;HTWATER软件https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247599079&idx2&sndc6f3da8b17c5587cf5b7766e7019729&chksmfa820200cdf58b16658983ecfbf2b369bff39813302942d6f7eb7b71428c68da71…

在 ubuntu server 22 上安装 Docker 引擎

在 ubuntu server 22 上安装 Docker 引擎 在开始之前&#xff0c;请确保你的系统满足以下条件&#xff1a; 64 位版本的 Ubuntu Mantic 23.10、Ubuntu Jammy 22.04 (LTS) 或 Ubuntu Focal 20.04 (LTS)使用 sudo 或 root 权限 安装步骤 1. 设置 Docker 的 apt 仓库 首先&am…

在Windows上交叉编译STM32(环境搭建)

在Windows上交叉编译STM32 Keil 虽然好用&#xff0c;但是是收费的&#xff0c;不想破解怎么办~ 使用交叉编译工具&#xff01; 交叉编译工具下载 官方交叉编译工具下载连接 下载解压好后将 bin 目录写入 PATH&#xff0c; 使用命令行检测是否安装成功。 Windows 安装 make …

未解决的问题:使用fgets循环读取字符串总是少一行

一、使用fgets循环读取字符串总是少一行 代码 #include<stdio.h> int main() {int n, i;scanf("%d", &n);char line[n][1000];for (i 0; i < n; i) {fgets(line[i], 1000, stdin);}for (i 0; i < n; i) {printf("%s", line[i]);}retur…

纳斯达克大屏媒体尺寸与投放费用:一次投放需要多少钱?

纳斯达克大屏媒体尺寸与投放费用&#xff1a;一次投放需要多少钱&#xff1f; 1. 纳斯达克图片要求 1.1 像素要求 高度&#xff1a;2336 像素宽度&#xff1a;1832 像素 1.2 分辨率要求 像素比率&#xff1a;1.0 px 72 dpi 1.3 文件格式要求 静态图片格式&#xff1a;.…

Django 仿博客园练习

数据库搭建 部分功能介绍 【一】注册 &#xff08;1&#xff09;效果显示、简单简介 主要亮点 结合了layui和forms组件默认头像可以随着性别的选择发生改变自定义头像可以实时更新显示forms组件报错信息可以局部刷新显示在对应框体下面 没有直接使用layui的前端验证后端验证…

unity中手势识别开源代码——HandPoseBarracuda

HandPoseBarracuda是一个使用单目彩色摄像头工作的神经网络手/手指追踪器的概念验证实现。 基本上,HandPoseBarracuda是MediaPipe Hands管道的一个部分端口。尽管它并不是原始包的直接端口,但它使用了相同的基本设计和相同的预训练模型。 请注意,这只是一个概念验证实现。…

SQLite数据库成为内存中数据库(三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; 下一篇&#xff1a;SQLite中的原子提交&#xff08;四) ​​ SQLite数据库通常存储在单个普通磁盘中文件。但是&#xff0c;在某些情况下&#xff0c;数据库可能…

Dockerfile和Docker-compose

一、概述 Dockerfile和Docker Compose是用于构建和管理 Docker 容器的两个工具&#xff0c;但它们的作用和使用方式不同。 Dockerfile Dockerfile 是一个文本文件&#xff0c;用于定义 Docker 镜像的构建规则。它包含一系列指令&#xff0c;如 FROM&#xff08;指定基础镜像…

excel统计分析——协方差分析基本原理

参考资料&#xff1a;生物统计学 方差分析中&#xff0c;要求除试验因素外的其他条件保持在相同水平上才能对实验结果的差异显著性进行比较&#xff0c;然而有些非试验因素很难或不可能人为控制&#xff0c;此时如果使用方差分析法推断处理其差异显著性&#xff0c;往往会导致错…

python数据解析xpath

前言一、安装&#xff1f;二、使用步骤1.基本使用**【2】谓语&#xff08;Predicates&#xff09;**案例 前言 xpath在Python的爬虫学习中&#xff0c;起着举足轻重的地位&#xff0c;对比正则表达式 re两者可以完成同样的工作&#xff0c;实现的功能也差不多&#xff0c;但xp…

Svn添加用户、添加用户组、配置项目权限等自动化配置脚本

实现在工作中自动化配置svn用户、用户组、和项目权限的脚本&#xff0c;在使用过程中如果有什么问题&#xff0c;可以联系我。 移步到gitee: svn account permission management: Svn账号、组、权限管理脚本 (gitee.com)

Linux进程的管理和进程的状态

进程的基本概念&#xff1a; 程序的一个执行实例 &#xff0c;正在执行的程序等等 ——— 课本概念 担当分配系统资源的实体&#xff0c;例如cpu时间&#xff0c;内存 -----内核的观点 一、进程的管理 processbar 存储在磁盘中的可执行文件 可执行文件在启动/运行的同时&…

阿里云安全产品简介,Web应用防火墙与云防火墙产品各自作用介绍

在阿里云的安全类云产品中&#xff0c;Web应用防火墙与云防火墙是用户比较关注的安全类云产品&#xff0c;二则在作用上并不是完全一样的&#xff0c;Web应用防火墙是一款网站Web应用安全的防护产品&#xff0c;云防火墙是一款公共云环境下的SaaS化防火墙&#xff0c;本文为大家…

【Flink connector】文件系统 SQL 连接器:实时写文件系统以及(kafka到hive)实战举例

文章目录 一. 滚动策略&#xff1a;sink后文件切分(暂不关注)1. 切分分区目录下的文件2. 小文件合并 二. 分区提交1. 分区提交触发器 &#xff08;什么时候创建分区&#xff09;1.1. 逻辑说明1.2. 举例说明 2. 分区时间提取器 (由分区字段来写分区名)2.1. 逻辑说明2.2. 举例说明…

政安晨:【Keras机器学习实践要点】(四)—— 顺序模型

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 介绍 Keras是一个用于构建和训练深度学习模…

MySQL数据库高级语句(一)

文章目录 MySQL高级语句older by 排序区间判断查询或与且&#xff08;or 与and&#xff09;嵌套查询&#xff08;多条件&#xff09;查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符 结语 MySQL高级语句 1构建测试用表 create table test1 (id int prima…

【搜索引擎1】Ubuntu通过deb方式安装ElasticSearch和Kibana、ik中文分词插件

1、官网下载文件 版本为官网最新版本&#xff0c;ElasticSearch与Kibana版本必须保持一致 ElasticSearch下载地址&#xff1a;Download Elasticsearch | Elastic Kibana下载地址&#xff1a;Past Releases of Elastic Stack Software | Elastic 下载选择DEB文件 ik插件下载…