django学习-5.获取url参数和name的作用
1.前言
假如我们要打开这两个博客园地址:【https://www.cnblogs.com/xiamen-momo/archive/2020/11.html】、【https://www.cnblogs.com/xiamen-momo/archive/2020/12.html】,会发现这两个地址的最大差别就是时间参数的值是动态的(年和月的值是动态的)。
那么,如果我们想要获取地址【https://www.cnblogs.com/xiamen-momo/archive/2020/11.html】里面的【2018】和【11】这两个值,就涉及到url参数值的获取了!


2.获取url里的参数和对应参数值
结合我们本地diango项目【helloworld】,比如我们想要获取地址【http://127.0.0.1:8000/archive/2020/10.html】里面的【2020】和【10】这两个值。
那么:
2.1.第一步:在【helloworld/hello/views.py】新增一个视图函数【home】,具体数据如图所示。


2.2.第二步:在【helloworld/helloworld/urls.py】新增一个path匹配规则,具体数据如图所示。

2.3.第三步:重新热启动django项目【helloworld】服务后,访问该地址【http://127.0.0.1:8000/archive/2020/10.html】,会得到正确的页面内容。

同理,访问该地址【http://127.0.0.1:8000/archive/2010/01.html】,也会得到正确的页面内容。

2.4.容易引起程序报错的场景:要注意path匹配规则里的参数名和对应视图函数里的参数名要每个都保持一致,不然脚本被调用后的执行过程中会报错导致程序中断。

举个实际反例:假如我现在把path匹配规则里的【year】改成【years】后,重新热启动django项目【helloworld】服务后,重新访问该地址【http://127.0.0.1:8000/archive/2020/10.html】,会返回给我这个报错页面!


3.url函数的正则匹配规则
通过【2.获取url里的参数和对应参数值】的案例,我们可以实现从一个url地址上获取到我们想要的参数year和参数month的值!
但是我们也会遇到一个问题:年和月的值可以输入任意数据类型的数据,如:【http://127.0.0.1:8000/archive/2020我w/10你n.html】,这样得到的参数值显然不符合实际场景的要求!

所以,我们如果想让参数year的值只能是4个数字,month参数的值只能是2个数字,该怎么做呢?这个时候,path函数就不满足我们的使用要求了,我们需要用url函数并用url函数的正则匹配功能来实现!
url函数的正则匹配规则常用的匹配规则有这些:
- ?P<一个唯一的参数名> ->作用:定义一个参数。(参数的命名要跟python语法的命名规则一样)
- [0-9] ->作用:匹配0到9范围内的任何一个数字。
- {4} ->作用:匹配长度为4的4个数字。
- {1,2} ->作用:匹配长度为1的1个数字,或者匹配长度为2的2个数字。
- r ->作用:raw原型。(r只跟一个字符串配合使用:r+一个字符串A。像这样【r"/n_xiaohong_\n"】,就表示字符串【"/n_xiaohong_\n"】里的任何一个数据都不转义都保持原始作用,打印出来的值仍然是【"/n_xiaohong_\n"】。)
- ^ ->作用:匹配开始。(一定是从【http协议或https协议//:IP:端口号/剩余的路径】的【http协议或https协议//:IP:端口号/】的【端口号/】里的【/】的右边第一个字符开始进行匹配。因为django框架会自动拿【http协议或https协议//:IP:端口号/】去跟【剩余的路径】进行拼接得到一个唯一的url的绝对路径。)
- $ ->作用:匹配结束。(一定是从【http协议或https协议//:IP:端口号/剩余的路径】的【剩余的路径】里的最后一个字符的右边结束匹配。)

3.1.第一步:在【helloworld/hello/views.py】新增一个视图函数【home1】,具体数据如图所示。

3.2.第二步:在【helloworld/helloworld/urls.py】新增一个url匹配规则,具体数据如图所示。

3.3.第三步:重新热启动django项目【helloworld】服务后,访问该地址【http://127.0.0.1:8000/archive1/1999/12.html】,会得到正确的页面内容。

值得注意的一个细节:如果参数month的值为一个任意数据,比如访问该地址【http://127.0.0.1:8000/archive1/2000/7.html】,也会得到正确的页面内容。

3.4.容易引起程序报错的场景:要注意url匹配规则里的参数名和对应视图函数里的参数名要每个都保持一致,不然脚本被调用后的执行过程中会报错导致程序中断。

举个实际反例:假如我现在把url匹配规则里的【year】改成【years】后,重新热启动django项目【helloworld】服务后,重新访问该地址【http://127.0.0.1:8000/archive1/2020/10.html】,会返回给我这个报错页面!


4.url函数中给参数name赋值的作用
首先,我们先提出一个问题:
假如我们的本地django项目【helloworld】已经有一个home.html,还有一个demo.html。之前这两个页面是独立的互不相关的,但现在我们要在home.html页面新增一个按钮A,当我们点击按钮A能跳转到demo.html的这个功能该如何实现呢?
4.1.第一步:在【helloworld/hello/templates/】里新增一个【home.html】,具体数据如图所示。

4.2.第二步:在【helloworld/hello/templates/】里已存在的【demo.html】的内容保持不变,具体数据如图所示。

4.3.第三步:在【helloworld/hello/views.py/】里新增两个视图函数:【demo2】、【home2】,具体数据如图所示。

4.4.第四步:在【helloworld/helloworld/urls.py/】里新增两个url匹配规则,具体数据如图所示。

4.5.第五步:重新热启动django项目【helloworld】服务后,访问该地址【http://127.0.0.1:8000/home2/】,会得到正确的页面内容。


base元素的html知识点可以参考这个菜鸟教程地址:https://www.runoob.com/tags/tag-base.html。

4.6.容易引起程序报错的场景。
假如我注释掉【home.html】里的元素base的信息,重新访问该地址【http://127.0.0.1:8000/home2/】后在当前展示页面里点击按钮【点击我这个按钮,可以跳转到demo页】,会得到错误的页面内容。



4.7.改成用url函数里的参数name的值来维护url地址。
如果在【helloworld/hello/templates/home.html】这个页面里面把元素a的属性href的值所对应的一个url的相对路径地址写死了,比如目前是写成【<a href="demo/">点击我这个按钮,可以跳转到demo页</a>】,这样的做法会有个弊端,那就是:当多个html页面比如30个不同的html页面代码里都用到这个地址【"demo/"】时候,如果后续这个地址【"demo/"】变成了【"demo666/"】,那就很难维护了,这时需要开发人员手动一个一个去修改数据,把这30个html页面里的地址【"demo/"】都改为地址【"demo666/"】。

所以,为了更好地维护每个html页面的元素a的属性href的值对应的url地址,我们可以在对应的url函数里的参数name赋值一个唯一的name值(name值可以理解为一个人的身份证号码)。
4.7.1.第一步:在【helloworld/helloworld/urls.py】里,自己需要给url函数里的参数name赋值的url函数进行赋值,具体数据如图所示。

4.7.2.第二步:在【helloworld/hello/templates/home.html】里,修改元素a的属性href的值对应的url地址:把旧数据【demo/】改为【{% url 'demo_page' %}】,具体数据如图所示。

4.7.3.第三步:重新访问该地址【http://127.0.0.1:8000/home2/】后在当前展示页面里点击按钮【点击我这个按钮,可以跳转到demo页】,会得到正确的页面内容。


4.7.4.容易引起程序报错的场景:当输入一个不存在的url地址,我们会访问到一个错误页面。比如访问该地址【http://127.0.0.1:8000/demo777/】,会得到错误的页面内容。

4.7.5.url函数里的参数name的值,按照实际开发规范,请确保参数name值的唯一性!
虽然参数name的值,在django框架里允许重复,但最好不要重复,不然会导致相关隐藏的错误(给用户配置的跳转页面地址可能会给错!)。
现在,我们可以结合实际代码,来进行分析!





从第一步到第五步,可以得出简单的结论:

django学习-5.获取url参数和name的作用的更多相关文章
- JavaScript学习之获取URL参数
最近看了几道面试题,其中有一道就是关于写一个方法来获取浏览器地址栏URL查询部分的字段内容.虽然之前看过相关的东西,但感觉有点模糊,所以就又全面的学习一遍,谨以此文记之! 准备知识 在JavaScri ...
- python测试开发django-4.获取url参数和name的作用
前言 如打开博客园按时间分类标签页[https://www.cnblogs.com/yoyoketang/archive/2018/10.html],里面是时间参数是动态的,如果我想获取里面的时间参数 ...
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...
- javascript获取url参数的方法
发布:thatboy 来源:Net [大 中 小] 本文介绍下,在javascript中取得url中某一个参数的方法,这里分享一个小例子,供大家学习参考下.本文转自:http://www. ...
- JavaScript获取URL参数公共方法
写一个JavaScript获取URL参数的通用方法,可以把它放到常用方法的JS文件中调用,直接上代码例子,新手可以学习一下! <!DOCTYPE html> <html lang=& ...
- JavaScript获取URL参数方法总汇
现在做页面基本都用AJAX,因此导致操作很麻烦,每次都需要通过JS获取url中的参数值,网上所搜到很多资料,没一次能记住的,也不知道在哪个项目中使用过,现在又需要通过JS获取url参数,因此不能在偷懒 ...
- js 获取url参数的值
//获取url参数函数function GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +" ...
- js对特殊字符转义、时间格式化、获取URL参数
/*特殊字符转义*/ function replace_html(str) { var str = str.toString().replace(/&/g, "&" ...
- 特殊字符转义&时间格式化&获取URL参数
/*特殊字符转义*/ function htmlspecialchars (str) { var str = str.toString().replace(/&/g, "&& ...
随机推荐
- Excel 快速填充:填充柄+数据验证
鼠标左键拖拽填充或者双击填充 右键拖拽填充: 可以填充等比数列.工作日等等 数据验证: 通过下拉箭头快速选择数据: 选择单元格区域-[数据]-[数据验证]-序列 数据科学交流群,群号:18915878 ...
- java判断是否为整数
/** * 判断是否为整数 * * @param str 传入的字符串 * @return 是整数返回true,否则返回false */ public static boolean isInteger ...
- python里正则表达式基础及注意事项
感觉正则匹配是一件很酷的事,用得好的话可以极大地提高编程效率.虽然在html中BeautifulSoup更好用一些,但有时候还是需要使用正则匹配.所以就此做一些学习和使用过程中的笔记. python有 ...
- 在Android用vulkan完成蓝绿幕扣像
效果图(1080P处理) 因为摄像头开启自动曝光,画面变动时,亮度变化导致扣像在转动时如上. 源码地址vulkan_extratest 这个demo主要测试二点,一是测试ndk camera集成效果, ...
- Infinite Maze
从起点开始走,对于可以走到的位置,都必定能从这个位置回到起点.这样,对地图进行搜索,当地图中的某一个被访问了两次,就能说明这个地图可以从起点走到无穷远. 搜索的坐标(x,y),x的绝对值可能大于n,的 ...
- 配置VS2013 + opencv 2.4.10
其实我内心是极力反对装这么老的版本的,但是要交课堂作业~~好无奈 [注] : 如果按照本文配置不成功,可以试一下其他博客里面的配置(多试一试总能成功的) https://jingyan.baidu.c ...
- UESTC 360(1425) another LCIS
这道题是CD老OJ上面的一道题,现在在新OJ上的题号是360,开始在VJ上做的提交一直RE(囧).后来才知道OJ移位了. 这道题是一个简单的成段更新+区间合并的线段树的题,1A还让我小激动了一下 这道 ...
- AtCoder Beginner Contest 176 E - Bomber (思维)
题意:有一张\(H\)x\(W\)的图,给你\(M\)个目标的位置,你可以在图中放置一枚炸弹,炸弹可以摧毁所在的那一行和一列,问最多可以摧毁多少目标. 题解:首先我们记录某一行和某一列目标最多的数目, ...
- Codeforces Global Round 11 B. Chess Cheater (贪心,结构体排序)
题意:你和朋友进行了\(n\)个回合的棋艺切磋,没有平局,每次要么输要么赢,每次赢可以得一分,假如前一局也赢了,那么可以得两分,结果已成定局,但是你确可以作弊,最多修改\(k\)个回合的结果,问你作弊 ...
- 51Nod - 1632
B国拥有n个城市,其交通系统呈树状结构,即任意两个城市存在且仅存在一条交通线将其连接.A国是B国的敌国企图秘密发射导弹打击B国的交通线,现假设每条交通线都有50%的概率被炸毁,B国希望知道在被炸毁之后 ...