百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Django框架学习笔记(五)URL页面跳转进阶及name属性

myzbx 2024-12-16 14:52 13 浏览

知道Django某一个功能的用途,比单纯地知道怎么用更有用。

今天我们要学习的内容是Django的页面跳转,重点讲的是使用url里的name参数

一、给url设置name属性

1. 我想修改路径名

根据前面做好的web项目,登录页面的url为: http://127.0.0.1:8000/login/;如果我们想把路径名login换成signin,该怎么做呢? 这时候我们就想到了在urls的urlpatterns里直接修改path路径名,

2. 遇到麻烦了

如果views里对应的方法有重定向跳转就麻烦了,因为重定向跳转的redirect方法里已经写了我们改名之前的路径名。如果我们在url里将login改成signin,做了一次改名操作了,那么在views里我们还要再改一次。如果有很多个页面都做了重定向到login页面,我们就需要对每一个函数进行修改操作,太麻烦了!有没有什么办法能让我们做路径修改的时候,只需要改一处就能搞定的呢?

3. 解决方法:利用name属性

实际上Django给我们提供了URL的name属性用来标记url,我们可以在path中给指定路径设置一个name属性,

Bash
urlpatterns = [
    path('signin/', app01_views.login, name="login"),
]

在views中做重定向时不直接写死路径名,而是通过reverse('属性名')反向查出前面的url,这样修改路径名就很方便了,直接修改path就可以了。

Bash
return redirect(reverse('login'))

通常情况下,我们是根据path里的路径名,找到views里的方法,然后渲染页面。而这里的重定向反转操作是根据路径名的name属性,反向找到路径的名称。 这样我们需要修改路径名的时候,views里都不要动的,反正它找的是指定的名称。name属性规定好了之后,url路径名想怎么改就怎么改。

注意:使用反转路径名的方法,需要导入包from django.shortcuts import reverse。

4. 如何使用URL的name属性

当前阶段我们主要用在两处: 在View中使用redirect(reverse("login"))

def index(request):
    username = request.GET.get('username')
    if username:
        return render(request,'index.html')
    else:
        return redirect(reverse('login'))

在html中使用模板语言{% url 'login' %}

<a href="{% url 'login'%}">登录</a>

5. 调用url的name时传递参数

我们先复习一下url传值的两种常见方法:

(1)直接使用url传值

以传递电影编号movie_id为例,如果想通过url传值。在定义path的时候,使用path("movile_detail/<movie_id>",...),然后在views里定义方法来接收movie_id这个值,就定义成def movie_id(request,movie_id),浏览器中访问的时候可以通过127.0.0.1:8000/movie_detail/8001就能把movie_id作为参数通过url传过去。

(2)使用查询字符串传值

我们还是以传递电影编号为例,如果想通过url传值。在定义path时,使用path("movie_detail/",...),在views里定义方法来接收就写成

def movie_id(request):
        movie_id = request.GET.get(movie_id)

在浏览器中访问是,url需要输入127.0.0.1:8000/?movie_id=8001。这样也能完成url的传值。

(3)传递参数

在views中,我们使用redirect重定向到一个新的url如果要传递参数该怎么办呢? 有两种方式:

  • 方式一: 使用tuple传参数,args=(''rico', '123')
  • 方式二: 使用dict传参数,kwargs={'username': 'rico', 'password': '123'}

url设置如下:

urlpatterns = [
    # 登录url
    path('login/<username>/<password>',app01_views.login, name='login'),
]

在views里定义login方法准备接收两个参数:

def login(request, username, password):
    return HttpResponse("用户名:%s \t 密码:%s" % (username, password))

传递参数时:

def index(request):
    username = request.GET.get('username')
    if username:
        return HttpResponse('=== 这是首页 ===')
    else:
        return redirect(reverse('login', kwargs={'username': 'rico', 'password': '123'}))

注意:是在reverse方法里添加参数,传的如果是元组则注意前后顺序,如果是字典就不用考虑前后顺序。

如果要在templates中通过模板语言调用url的名称, 模板语言里使用url传递参数可以写成这样:

{% url 'login' username='xiaoyu' password='123' %}

二、多app环境下URL的命名

在多app项目中,如果各自的name属性相同,在重定向访问的时候会出现无法访问指定app下的url的问题。这时候我们就在各自app的urls中添加命名空间

app_name = 'app01'

然后在重定向访问指定url名称的时候,添加命名空间属性即可。

def index(request):
    username = request.GET.get('username')
    if username:
        return render(request, 'app01/index.html')
    else:
        return redirect(reverse('app01:login'))

注意:项目总体url配置使用include关键字,将多个app配置到总路由中。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include('app01.urls')),
    path('app02/',include('app02.urls')),
]

最后

这一节,我们主要介绍了Django中url路由跳转的进阶知识,下一节,我们将介绍Django下html页面中的模板语言DTL,感谢大家的阅读~

相关推荐

魔兽WLK:P2牌子装机制详解,232装备直接拿,肯瑞托戒指成真BIS

魔兽世界WLK怀旧服P2阶段即将开放,虽然国服只能体验3天时间,但是鉴于绝大部分玩家都认为国服未来还有重新开放的希望,因此在这3天时间内也可以收集一些非常不错的装备,下面胖哥就和大家分享一下P2阶段牌...

PDD旗下的小马是谁,有多强,你们知道吗?

lol国服最强王者第一是谁?曾经的国服大神区艾欧尼亚迎来了一位18岁王者第一,王者1600胜点,堪称国服史上最高,18岁少年登顶LOL国服第一,lol马彦毅个人资料及id段位介绍。1600胜点,国服史...

Vorsteiner Wheels改装蓝色奥迪S5

当你想到奥迪S5,那么你就想象一种结合性能和豪华优雅的运动跑车。由于车辆低调的设计,将很难再叫S5'大胆'或'古怪'。下面的S5,Vorsteiner最近插手但肯定是这两件事情。毫无疑问,最值得关注...

英雄联盟S6排位奖励徽章曝光 质感十足

近日,英雄联盟客户端再次迎来更新,官方曝光了青铜到最强王者8个段位的徽章,看起来非常精致和形象。从无段位的黄色圆环到金色的王者边框,段位越高光泽和款式也更加华丽丰富。不同于以往"展翼"的形象,圆环...

Apple Watch Series 5外观与上代相同,内部构造呢?

集微网消息(文/叶子),苹果今年更新的AppleWatchSeries5在整体外观上延续了上一代的设计,依旧是传统的方形表盘设计,采用40mm/44mm表盘。既然外观没有太大变化,那内部结构呢?...

教你如何连接Gear 三星GALAXY Tab S教程

平板电脑和智能手表是当前两大热门的数码产品,智能穿戴设备也成为今年各大IT厂商下大力气推广的领域,尤其是智能手表异常火热。三星旗下Gear智能手表已经推出了第二代产品,无论是做工品质还是软件功能以及交...

试试这个,你的三星S5/Note4能更快

IT之家(www.ithome.com):试试这个,你的三星S5/Note4能更快想到三星手机,大家脑海中免不了出现Galaxy,这个系列的三星手机颇受欢迎,同时也是三星的旗舰系列。当然这个系列的手机...

Surface Book详细拆解:千万不要自己动手修

微软或许打造了世界上最好的笔记本之一——SurfaceBook,如果你购买了SurfaceBook,我们为你拥有这样一款优秀的笔记本而开心,不过,我们也为你要维修这样一款笔记本而担忧,奉劝你最好不...

蒂升电梯蒂森UCMP轿厢移动测试及复位方法

蒂升电梯蒂森UCMP轿厢移动测试及复位方法UCMP功能测试一、轿厢上行制停距离测试注意空载状态下1、将电梯轿箱停靠在次高层平层位置2、按下主板锁门按钮(MC1∶S4在MZ1、MC2∶S804按钮),将...

18张图!看懂六代三星GALAXY S的改变

从2010年的第一代三星GALAXYS,到2015年的第六代三星GALAXYS6,五年的时间,三星GALAXYS系列经历了六代的更迭,你还能记得第一代产品的样子吗?你还能记得每一代产品的配置吗?...

芯片级电脑维修,需掌握的20个信号,学懂后常见的故障不用求人

很大小白都知道,做技术的每个人都希望把相关的电路与相关的时序全部搞懂,对于大多数的信号名称与作用都不是很了解决,在这里我列出的部分主要的信号名称给大家参考,如果大家觉得有用的话建议大家可以学习与收芯片...

终于还是入了全画幅——松下S5(20-60/50mm)双镜头套装开箱

一、简单开箱视频开箱视频二、购买过程用了一年多的ZV-E10,其实主要用处还是给小孩拍日常记录照片。虽然ZV-E10是一台偏向视频的机器,真正实操体验过后才会知道视频上手难度比拍照大多了,想要观感不...

京张高铁昌平北站项目部开展安全生产警示教育活动

6月20日,中铁六局建安公司安在京张高铁昌平北站项目部开展安全生产警示教育活动。千龙网发千龙网北京6月21日讯(记者李贺)“看了这些案例,有些安全事故还是可以避免的,如果稍加小心,就不会造成工地意外...

深圳男子微博举报高速被恶意别车,视频却让网友炸了:坑老婆?

再过几天就是春节而春运大潮早已经开始每年一到这个时候总有一些小伙伴商量着自驾回家而说到自驾出行驾驶在高速公路上各位司机总有一箩筐的"槽"要吐其他的不多说光是恶意别车这一项就足够令各位老司机们心累了这不...

开车慢也违法?高速路上低速行驶,贵阳交警开出罚单!

平时一直强调的是“杜绝飙车”“小心不要超速!”“开快车很危险”然而也许有不少朋友或者不清楚低速行驶也违法!案例一近日,贵阳交警高速一大队民警巡逻时发现,一辆号牌为贵A8**S5号轻型货车沿兰海高速公路...