Django url,从一个页面调到另个页面的方法


Posted in Python onAugust 21, 2019

创建项目和应用

django-admin startproject zqxt_views(项目名)
cd zqxt_views
python manage.py startapp calc(应用名)

————?1.采用/add?a=4&b=5这样GET方法进行—————————

修改 calc/view.py文件

from django.shortcuts import render
from django.http import HttpResponse

def add(request):
 a = request.GET['a']
 b = request.GET['b']
 c = int(a)+int(b)
 return HttpResponse(str(c))

修改 zqxt_views/urls.py 文件,添加一个网址来对应我们刚才新建的视图函数。

from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views

urlpatterns = [
 url(r'^add/$', calc_views.add, name='add'), # 注意修改了这一行
 url(r'^admin/', admin.site.urls),
]

打开服务器并访问

python manage.py runserver 8003

打开网址

http://127.0.0.1:8003/add/?a=4&b=5

————?2.采用/add/3/4这样的网址的方式—————————

修改 calc/views.py 文件,再定义一个add2函数

def add2(request, a, b):
 c = int(a) + int(b)
 return HttpResponse(str(c))

接着修改 zqxt_views/urls.py 文件,再添加一个新的 url

url(r'^add/(\d+)/(\d+)/$',calc_views.add2,name='add2'),

我们可以看到网址中多了 (\d+), 正则表达式中 \d 代表一个数字,+ 代表一个或多个前面的字符,写在一起 \d+ 就是一个或多个数字,用括号括起来的意思是保存为一个子组,每一个子组将作为一个参数,被 views.py 中的对应视图函数接收。

我们再访问 http://127.0.0.1:8003/add/4/5/ 就可以看到和刚才同样的效果,但是这回网址更优雅了

打开 zqxt_views/urls.py

from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views

urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^add/$',calc_views.add,name='add'),
 url(r'^add/(\d+)/(\d+)/$',calc_views.add2,name='add2'),
]

在 url(r'^add/$',calc_views.add,name='add'),中,name='add'是用来干什么滴啊?

简单说,name可用于在templates,models,views……中得到对应的网址,相当于给“网址取了一个名字”,只要名字不变,网址变了也能通过名字获取到。

为了继续弄清楚这个问题,我们先建立一个首页的视图和url

修改 *calc/views.py*

from django.http import HttpResponse
from django.shortcuts import render


def index(request):
 return render(request, 'home.html')

render 是渲染模板

将‘calc'这个app加入到*zqxt_views/settings.py 中*

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',

 'calc',
]

这样,使用render的时候,Django会自动找到INSTALLED_APPS中列出的各个app下的templates中的文件。

提示:DEBUG=True的时候,Django可以自动找到各个app下static文件中的静态文件(js,css,图片,资源)

我们在calc这个app中新建一个templates文件夹,在templates中新建一个home.html

文件 calc/templates/home.html 中写入以下内容

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>title</title>
</head>
<body>
 <a href="/add/4/5" rel="external nofollow" >计算 4 + 5 </a>
</body>
</html>

修改zqxt_views/urls.py

urlpatterns = [
 url(r'^$', calc_views.index, name='home'),
 url(r'^add/$', calc_views.add, name='add'),
 url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
 url(r'^admin/', admin.site.urls),
]

运行服务器python manage.py runserver 8004,访问http://127.0.0.1:8004/

我们计算加法的时候用的是 /add/4/5/ ,后来需求发生变化,比如改成 /4_add_5/,但在网页中,代码中很多地方都写死的 /add/4/5/,比如模板中可能是这么写的

<a href="/add/4/5/" rel="external nofollow" rel="external nofollow" >计算 4+5</a>

如果这样写“死网址”,会使得在改了网址(正则)后,模板(template),视图(views.py,比如用于URL跳转),模型(models.py,获取记录访问地址等)用了此网址的,都必须进行相应的更改,修改的代价很大,一不小心,有的地方没改过来,就不能用了。

reverse 接收 url 中的 name 作为第一个参数,我们在代码中就可以通过 reverse() 来获取对应的网址

我们在终端上输入:python manage.py shell

>>> from django.core.urlresolvers import reverse # django 1.4.x - django 1.10.x

或者

>>> from django.urls import reverse # Django 1.10.x - Django 2.x 新的,更加规范了

>>> reverse('add2', args=(4,5))
u'/add/4/5/'
>>> reverse('add2', args=(444,555))
u'/add/444/555/'

在网页模板中也是一样,可以很方便的使用。

不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}

因此,我们将:templates/home.html 中

<a href="/add/4/5/" rel="external nofollow" rel="external nofollow" >link</a>改成
<a href="{% url 'add2' 4 5 %}" rel="external nofollow" >link</a>

这样的话,当 urls.py 进行更改,前提是不改 name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成:

url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

{% url ‘add2' 4 5 %}就会被渲染成/new_add/4/5/

有另外一个情况,如果我们原来收藏的一个网址,现在这个网址被废了,现在有个新的网址,如何让以前的/add/3/4自动跳转到新的网址那?

具体的思路是,在view.py写一个跳转方法:

from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

def old_add2_redirect(request, a, b):
 return HttpResponseRedirect(
 reverse('add2', args=(a, b))
 )

以上这篇Django url,从一个页面调到另个页面的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python随机生成一个6位的验证码代码分享
Mar 24 Python
举例讲解Python中is和id的用法
Apr 03 Python
一步步解析Python斗牛游戏的概率
Feb 12 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
Python多线程扫描端口代码示例
Feb 09 Python
python实现汽车管理系统
Nov 30 Python
在Python文件中指定Python解释器的方法
Feb 18 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
详解python运行三种方式
May 13 Python
Django框架 查询Extra功能实现解析
Sep 04 Python
Python 如何在字符串中插入变量
Aug 01 Python
Flask response响应的具体使用
Jul 15 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 #Python
docker django无法访问redis容器的解决方法
Aug 21 #Python
django和vue实现数据交互的方法
Aug 21 #Python
python防止随意修改类属性的实现方法
Aug 21 #Python
python进阶之自定义可迭代的类
Aug 20 #Python
关于阿里云oss获取sts凭证 app直传 python的实例
Aug 20 #Python
django中使用POST方法获取POST数据
Aug 20 #Python
You might like
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
php微信开发之自定义菜单实现
2016/11/18 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
JS 进度条效果实现代码整理
2011/05/21 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python实现字典去除重复的方法示例
2017/07/31 Python
详解Python 模拟实现生产者消费者模式的实例
2017/08/10 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
给朋友的道歉信
2014/01/09 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
施工单位安全责任书
2014/07/24 职场文书
党的生日演讲稿
2014/09/10 职场文书
跑吧孩子观后感
2015/06/10 职场文书
简爱读书笔记
2015/06/26 职场文书
大学生受助感言
2015/08/01 职场文书