目录

一、视图函数

二、URL传参

方法1.在url中使用参数

方法2.查询字符串方式使url传参

三、URL参数转换器

四、URL分层模块化

五、URL的命名

六、应用命名空间、实例命名空间


一、视图函数

视图函数:

1.第一个函数的参数必须是request

2.视图函数的返回值必须是HTTPResponseBase的及其子类

二、URL传参

方法1.在url中使用参数

首先需要在视图函数的参数中写明要传递的参数,比如在play应用中的views.py写一个playing函数,需要传递歌曲id和种类id

def playing(request,song_id,category_id):text = "您播放的歌曲id是:%s ,歌曲种类id:%s" % (song_id,category_id)return HttpResponse(text)

然后在项目firstproject里的urls.py中写一个url,paly是应用名,playing是函数名,然后将视图函数的参数复制到<>里边

path('play/playing/<song_id>/<category_id>/', views.playing),

在访问时,需要按照 定义的url的格式传入参数,如果有参数个数不对等问题,都会出不来结果

方法2.查询字符串方式使url传参

如下图,大多数查询都使用这种查询字符串的方式,?后边即为查询的内容,

此种方法不需要在视图函数中逐一匹配参数,只需写明GET请求传递的参数,下面的id即是查询时?id=“查询的内容”

def singer_detail(request):singer_id = request.GET.get('id')text = '歌手的id是:%s' % singer_idreturn HttpResponse(text)

在项目的urls里,定义的play即为应用play的名称,singer_id即为查询之前匹配的字符,也可以改成别的,比如singer,只要在访问的时候和这个定义的url一致就可以

 path('play/singer_id/', views.singer_detail),

三、URL参数转换器

  1. str:除了'/'之外都可以
  2. int:只有一个或多个阿拉伯数字才可以
  3. path:所有字符都可以
  4. UUID:只有满足'uuid.uuid4()'这个函数返回的 字符串才满足
  5. slug:英文中的-或者英文字符、阿拉伯数字或者下划线才满足

比如限制歌曲id为阿拉伯数字,种类id是字符

 path('play/playing/<int:song_id>/<str:category_id>/', views.playing),

如果song_id不是阿拉伯数字,就会报错

四、URL分层模块化

当页面太多,有太多个关于不同内容的url在项目firstproject中的url定义时就会容易太乱,可以根据不同的内容,比如所有关于播放play这个模块的url可以放在应用play的urls.py里,模块化操作如下:

步骤1. 在应用play中新建urls.py,写入如下代码:不同于项目中的urls.py里的定义,在此处定义的url默认是从play开始path('',views.play),是指path('play',views.play)。其他的没有区别

from django.urls import path
from . import views
urlpatterns = [path('', views.play),# path('play/playing/<int:song_id>/<str:category_id>/', views.playing),path('playing/<int:song_id>/<str:category_id>/', views.playing),path('singer/', views.singer_detail),
]

步骤2:而在项目的urls.py中,导入include的引用,然后在url定义中前半部分是应用play的url中省下的部分,后半部分加入include(),include里边是导入的应用play里的urls,这里是项目的urls和play的urls进行了拼接

from django.urls import path,include
from play import views
from django.http import HttpResponseurlpatterns = [path('admin/', admin.site.urls),path('play/', include('play.urls')),
]

五、URL的命名

1.为什么要命名?

比如在做跳转时,会经常修改url,而此时已经有多处都用到url,所以如果给url一个命名,在views.py文件中使用的是url的命名,只需要翻转一下,就可以找到在urls.py中定义的原来的url,如果想要修改url,也只需要去urls.py中修改一处即可

2.如何命名?

比如在user的urls.py中,只需在path中加一个name参数

from django.urls import path
from . import viewsurlpatterns = [path('', views.index, name='index'),path('login/', views.login, name='signin'),
]

在views.py中的视图函数使用时,可以将url的命名用reversed反转一下,然后代替原来的url写入跳转函数中,如下:

from django.http import HttpResponse
from django.shortcuts import redirectdef index(request):username = request.GET.get('username')if username:return HttpResponse("用户中心")else:login_url = reversed('signin')return redirect(login_url)#return redirect('/user/login/')def login(request):return HttpResponse("登录页面")

六、应用命名空间、实例命名空间

  • 为什么要用应用命名空间?

在做反转时,reverse('urlname')会根据拥有此url名字的url进行解析,但是如果多个应用有相同的url名称,那么可能出来的是别的应用的页面,所以应用命名空间,app_name是应用命名空间的参数,比如user的urls.py中代码如下:

from django.urls import path
from . import views#应用命名空间的变量叫做app_name
app_name = 'user'
urlpatterns = [path('', views.index, name='index'),path('login/', views.login, name='signin'),
]
  • 为什么要用实例命名空间呢?

同一个app可以使用不同的url进行映射,即同一个app下可以有多个实例,而用应用命名空间做反转的时候,就会发生混淆,所以实例名命名空间>应用命名空间,而且必须有应用命名空间,才能使用实例命名空间。代码如下:

在项目的urls.py里,namespace为实例名命的参数

    path('user1/', include('user.urls', namespace='user1')),path('user2/', include('user.urls', namespace='user2')),

在应用user的urls.py里的视图函数中利用request.resolver_match.namespace 获取实例命名空间

current_namespace = request.resolver_match.namespace
return redirect(reversed("%s:login"%current_namespace))

视频课:https://www.bilibili.com/video/av93363026?p=34

Django学习4:URL传参相关推荐

  1. Java URL传参中文乱码问题

    2019独角兽企业重金招聘Python工程师标准>>> 我们经常会遇到这样的场景:在URL中传递参数,如果该参数为中文,如果设置不当,会出现乱码问题. URL传参所使用的编码为服务器 ...

  2. Vue学习(组件传参)-学习笔记

    文章目录 Vue学习(组件传参)-学习笔记 父到子 子到父 父操作子-ref(类似于操作dom) 兄弟之间传参 Vue学习(组件传参)-学习笔记 父到子 Father:(index) <temp ...

  3. python get请求 url传参_requests的get请求url参数、url重定向处理及cookies

    需求:在百度搜索www.python66.com,然后将搜索结果保存到文件bd_python66.html 百度搜索的url:https://www.baidu.com/s?wd=搜索词 params ...

  4. 关于url传参中文乱码问题

    之前都一直很不了解中文编码得问题,之前在做项目中没碰到那么头痛的问题.所以一直没有了解中文乱码的问题. 问题描述: 地址: http://localhost:8080/sun-government/c ...

  5. MySQL_PHP学习笔记_2015_0614_PHP传参总结_URL传参_表单传参

    1. PHP 传参总结   1.1 url 传参 解析方法(下面两种解读方式均可以): $firstName1 = $_GET['firstName']; $firstName2 = $_REQUES ...

  6. 微信小程序页面跳转,url传参参数丢失问题

    微信小程序页面跳转,url传参参数丢失问题 // pages/order/purchase/index.js// 跳转到采购订单详情toPurchaseOrderDetail(e) {// conso ...

  7. 记一次vue踩坑 this.$router.back()在ios失效,试了各种返回,最后发现是因为url传参的原因,去掉参数就可以了。。

    因为之前有项目也用过类型的,我就找不同,发现之前项目的打包完直接用的....index.html访问 现在的项目 用的....index.html#/访问的 --------------------- ...

  8. URL传参时 从URL中获取中文参数的方法

    利用url传参时如果url中的参数是中文时因为编码类型不同在页面中获取会出现乱码 使用此方法能获取url中的参数值 并解决乱码问题 调用时直接 GetUrlByParamName("参数名& ...

  9. vue前后端aes url传参解密再解base64编码

    需求:我们公司做机票订购服务,有自己的平台的订单,也有第三方网站向我们网站导入的用户订单,第三方导入的是通过url传参的方式导入.url会携带用户的相关信息. url里面的参数是经过aes加密和bas ...

最新文章

  1. 启动hadoop的节点
  2. bios x86保护模式下的软盘操作floppy
  3. 【Classification】分类的进阶
  4. 星晨急便凶多吉少:马云陈显宝无意援手或破产
  5. segnet 编译与测试
  6. 用于MLOps的MLflow简介第1部分:Anaconda环境
  7. 一文搞清楚 Spark RDD到底是什么?
  8. C++Primer Plus第6版C Primer Plus第6版 中文版免费分享啦
  9. C++中vector的用法
  10. android游戏boss坐标,混沌与秩序2已知boss刷新点分布图详解(已更新到20号boss)...
  11. 软考数据库系统工程师笔记
  12. python深度学习 共享 弗朗索瓦•肖莱(François Chollet)
  13. 计算机连接了无线网络显示有限的访问权限,win7连接无线网络提示有限的访问权限怎么办...
  14. 弱水三千,只取一瓢,当图像搜索遇见PostgreSQL(Haar wavelet)
  15. tplink软件升级有用吗_新版tplink路由器固件升级_tplink软件升级方法-192路由网
  16. c++ 让程序玩贪吃蛇游戏
  17. 解决import cv2找不到指定模块问题
  18. Blender 如何添加渲染AO,Bloom~~
  19. cs224w(图机器学习)2021冬季课程学习笔记4 Link Analysis: PageRank (Graph as Matrix)
  20. SDUT-1150 因式分解

热门文章

  1. Salesforce Admin管理员中文学习教程_如何高效筛选出具有Admin权限的用户!
  2. c语言字符串函数难题,一些常见的C语言字符串操作
  3. 药企的主数据以及质量管理这块应该怎么管理?
  4. 【Vue】实现登录功能
  5. Windows任务计划程序+.vbs+点击程序实现CSDN自动签到
  6. docker编程:学习 docker 官方文档哪里下? -YDOOK
  7. HTML5里js制作个人理财系统,基于HTML5的个人在线理财系统的设计与实现
  8. 筋膜枪PCBA板芯片方案支持无刷电机和有刷电机
  9. Android平板cpu品牌,华为旗舰平板M6/nova 5/Pro均搭载麒麟980处理器
  10. javaCV开发详解之16:使用一张图片推流和一张图片录制成视频文件