Django(二)路由系统、视图、模板
大纲
一、内容概要:
二、上节回顾
三、Django 视图–views
1、获取用户多个数据及文件上传
2、FBV 和 CBV
3、装饰器
四、Django模板补充
- Django模板语言循环字典
五、Django 路由系统
1、一对一:一个url对于一个函数或者一个类
2.1、一对多:一类url对应一个函数或者一个类
2.2、一对多,用法总结
3、name参数
4、url 路由分发机制
5、默认值
6、命名空间
一、内容概要:
1、路由系统——urls
2、视图
3、模板
4、ORM操作
select * from tb where id > 1
# 对应关系
models.tb.objects.filter(id__gt=1)
models.tb.objects.filter(id=1)
models.tb.objects.filter(id__lt=1)
二、上节回顾
1、Django请求生命周期
客户端 -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串
客户端 -> URL对应关系(匹配) -> 视图函数 -> 打开一个HTML文件,读取内容
2.1、创建django projcet
django-admin startproject mysite
..
mysite
mysite
- 配置文件
- urls.py
- settings.py
2.2创建django project app
cd mysite
python manage.py startapp cmdb mysite
mysite
……
cmdb
- views.py
- admin.py
- models.py # 创建数据库表
3、配置
模板路径
静态文件路径
# 注释 CSRF
4、编写程序
a. url.py
/index/ -> func
b. views.py
def func(request):
# request:包含所有的请求数据
...
return HttpResponse('字符串') # 返回字符串
return render(request, 'index.html', {''}) # 返回模板内容
retrun redirect('URL') # 返回url
c. 模板语言
return render(request, 'index.html', {'li': [11,22,33]}) {% for item in li %} # 模板语音for循环
<h1>{{item}}</h1>
{% endfor %} *********** 去索引:索引用点 **********
<h2> {{item[0] }} </h2> # 不能这么用,
<h2> {{item.0 }} </h2> # 正确写法
三、Django 视图–views
1、获取用户多个数据及文件上传
- 1、获取用户请求数据
request.GET # 获取相应信息中get发送的数据
request.POST # 获取相应信息中post发送的数据
request.FILES # 获取相应信息中发送的文件数据
PS: # get和post都是往后台发送数据,只是get信息在网址中,post信息包含着数据内,往往:
GET: # 获取数据
POST: # 提交数据
- 2、checkbox等多选的内容
request.POST.getlist() # get只能获取一个值,像复选框、多选下拉框时,需要用getlist获取
- 3、上传文件
# 上传文件,form标签做特殊设置 enctype="multipart/form-data"
obj = request.FILES.get('fafafa') # 获取上传文件对象
print( obj.name ) # 上传文件名称
f = open(obj.name, mode='wb')
for item in obj.chunks(): # chunks():分块,一点一点取数据(生成器、迭代器)
f.write(item)
f.close()
示例:用户提交数据,后台接收响应数据,并进行处理
工程名:mysite,app名:cmdb,创建接收用户上传数据目录upload
mysite/urls.py
from django.contrib import admin
from cmdb import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
]
cmdb/views.py
from django.shortcuts import render, redirect,HttpResponse def login(request):
if request.method == "GET":
return render(request, 'reg.html')
elif request.method == "POST":
# redio 单选框获取
redio = request.POST.get("gender")
print("单选框的值:", redio)
# checkbox 复选框获取
checkbox = request.POST.getlist("favor")
print("复选框的值", checkbox)
# 获取文件数据
obj = request.FILES.get("fafafa")
print(obj, type(obj), obj.name) # 打印文件信息
import os
file_path = os.path.join('upload', obj.name)
with open (file_path, mode="wb") as f:
for i in obj.chunks():
f.write(i)
return render(request, "reg.html")
else:
# PUT, DELETE, HEAD, OPTION……
return redirect("/reg/")
templates/reg.html
<body>
<form action="/login/" method="POST" enctype="multipart/form-data">
<p>
<input type="text" name="user" placeholder="用户名" />
</p>
<p>
<input type="password" name="pwd" placeholder="密码" />
</p>
<p>性别:
男:<input type="radio" name="gender" value="1"/>
女:<input type="radio" name="gender" value="2"/>
</p>
<p>爱好:
男:<input type="checkbox" name="favor" value="11"/>
女:<input type="checkbox" name="favor" value="22"/>
</p>
<p>
<select name="city" multiple>
<option value="sh">上海</option>
<option value="bj">北京</option>
<option value="tj">天津</option>
</select>
</p>
<p>
<input type="file" name="fafafa"/>
</p>
<input type="submit" value="提交"/>
</form>
</body>
2、FBV 和 CBV
像这种urls.py里匹配login,之后对应一个函数名。当匹配成功之后,就 执行views.py里的这个函数,函数里第一个参数封装了所有的用户请求信息。像这种叫FBV(function base view)
Django 里面还有一种:CBV(class base view)
/index/ -> 函数名
/index/ -> 类
上面都是FBV的方式,下面看看CBV写法:
urls.py
url(r'^home/', views.Home.as_view()), # CBV 固定用法
views.py
from django.views import View class Home(View): # 自定义的类必须继承View
# 重写父类dispatch方法。程序定制时可以使用
# 父类的dispatch方法,查找get、post等方法,基于反射实现的。
def dispatch(self, request, *args, **kwargs):
print("类似装饰器:before")
result = super(Home,self).dispatch(request, *args, **kwargs)
print("类似装饰器:after")
return result def get(self,request): # 定义get方法,get请求执行这个方法
print(request.method)
return render(request, "home.html") def post(self,request): # 定义post方法,post请求执行这个方法
print(request.method,"post方式")
return render(request, "home.html")
home.html
<body>
<form action="/home/" method="POST">
<input type="text" name="user" />
<input type="submit" />
</form>
</body>
3、装饰器
后续文章补充
四、Django模板补充
- Django模板语言循环字典
urls.py
url(r'^index/', views.index),
views.py
USER_DICT = {
'key1':{'name':'root1','eamil':'root@126.com'},
'key2':{'name':'root2','eamil':'root@126.com'},
'key3':{'name':'root3','eamil':'root@126.com'},
}
def index(request):
return render(request, 'index.html', {'user_dict': USER_DICT})
index.html
<body>
{{ user_dict.k1 }}
<ul>
{# for row in user_dict # 默认循环显示的是key #}
{% for k in user_dict.keys %} {# 循环字典:取key值 #}
<li>{{ k }}</li>
{% endfor %}
</ul>
<ul>
{% for val in user_dict.values %} {# 循环字典:取value值 #}
<li>{{ val }}</li>
{% endfor %}
</ul>
<ul>
{% for k,row in user_dict.items %} {# 循环字典:取key、value #}
<li>{{ k }}-{{ row }}</li>
{% endfor %}
</ul>
</body>
五、Django 路由系统
1、一对一:一个url对于一个函数或者一个类
url(r'^index/', views.index),
url(r'^home/', views.Home.as_view()),
2.1、一对多:一类url对应一个函数或者一个类
如上循环字典的显示,如果是主机信息,应该显示主机名,点击才显示详细信息。实现如下:
urls.py
url(r'^index/', views.index),
url(r'^detail-(key\d+).html/', views.detail),
注意:这里网址实现的方式是类似http://127.0.0.1/detail-key1.html
,而不是之前的detail?nid=key1
的方式。这种方式,对于网站权重来说,搜索引擎更喜欢第一种方式。权重更好,会让搜索引擎以为网页是静态的。
views.py
USER_DICT = {
'key1':{'name':'root1','eamil':'root@126.com'},
'key2':{'name':'root2','eamil':'root@126.com'},
'key3':{'name':'root3','eamil':'root@126.com'},
'key4':{'name':'root4','eamil':'root@126.com'},
'key5':{'name':'root5','eamil':'root@126.com'},
}
def index(request):
return render(request, 'index.html', {'user_dict': USER_DICT}) def detail(request, nid):
# nid: url里正则二次过滤获取的值
detail_info = USER_DICT[nid]
return render (request, 'detail.html', {'detail_info': detail_info})
index.html
<ul>
{% for k,row in user_dict.items %}
<li><a target="_blank" href="/detail-{{ k }}.html">{{ row.name }}</a></li>
{% endfor %}
</ul>
detail.html
<body>
<h1>详细信息</h1>
<h6>用户名:{{ detail_info.name }}</h6>
<h6>邮箱:{{ detail_info.email }}</h6>
</body>
2.2、一对多,用法总结
- 上面的示例中,二次匹配一个值,多传一个形参匹配:
urls.py:url(r'^detail-(key\d+).html/', views.detail),
views.py:def detail(request, nid):
访问网址:127.0.0.1/detail-key1.html
- 如果再多匹配一个值,则如下:
urls.py:url(r'^detail-(key\d+)-(\d+).html/', views.detail),
views.py:def detail(request, nid, uid):
访问网址:127.0.0.1/detail-key1-9.html
可见:url中二次匹配的值,和形参必须一一对应,但如果位置改了,里面的代码也得跟着改
- 支持正则表达式 分组
urls.py:url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html/', views.detail),
直接第一个匹配的传递给nid,第二个匹配的传递给uid,这样和views里的函数形参位置没有关系了。
views.py:def detail(request, nid, uid):
访问网址:127.0.0.1/detail-key1-9.html
- 分组时,个数不确定*args,**kwargs也能使用
url(r'^detail-(key\d+)-(\d+).html/', views.detail),
——> def detail(request, *args):
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html/', views.detail),
——> def detail(request, **kwargs):
3、name参数
如下内容:提交表单中action="/home/"
需要跟着url中网址的修改而修改。
home.html
<form action="/home/" method="POST">
<input type="text" name="user" />
<input type="submit" />
</form>
urls.py
url(r'^home/', views.home),
其他web框架也是这么实现的,要改两处都需要跟着修改。这里django给提供了一个便捷的用法,name参数。
name :django 简便用法
对URL路由关系进行命名, 以后可以根据此名称生成自己想要的URL
urls.py
url(r'^home/', views.home, name="homeee"),
home.html
<form action="{% url 'homeee' %}" method="POST">
<input type="text" name="user" />
<input type="submit" />
</form>
这样写上之后,url变了,只修改urls.py那里一处就可以了。
- name :匹配地址里有分组的处理
第二种:
# urls.py
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
# views.py
def index(request,nid,uid):
......
# html
{% url "i2" 1 2 %} # 成功匹配都,都跳转到: yug/1/2/
第三种:
# urls.py
url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'), # # buy/1/9/
# html
{% url "i3" pid=1 nid=9 %} # buy/1/9/
上面是通过模板语音生成url,下面是通过reverse模块生成url,两种方式,实现功能一样。
url(r'^asdfasdfasdf/', views.index, name='ii'),
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'),
# views.py 文件
def func(request, *args, **kwargs):
from django.urls import reverse # 根据名字反转生成一个url
url1 = reverse('i1') # asdfasdfasdf/
url2 = reverse('i2', args=(1,2,)) # yug/1/2/
url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/
作用:用户完成某些操作后,跳转到指定页面。
# 注:
request.path_info # 当前的url
def index(request,nid):
print(request.path_info)
return render(request, 'index.html') <form action="{{ request.path_info }}" method="POST">
4、url 路由分发机制
前面的urls对应关系都在urls.py内,如果多个app,都需要在这里引入。如果app多了,任何一个app的修改都会修改这一个urls文件。
在django里面,有一个url分发的机制。
urls.py
from django.conf.urls import include
urlpatterns = [
url(r'^monitor/', include("app02.urls")),
]
app02/urls.py
from django.conf.urls import url
from app02 import views urlpatterns = [
url(r'^login/', views.login),
]
访问http://127.0.0.1/monitor/login
,就访问的app02的login页面。
5、默认值
6、命名空间
后续文章补充
转载请务必保留此出处:http://www.cnblogs.com/lgeng/articles/7363951.html
<!-- END -->
《版权说明》:本文--http://blog.csdn.net/fgf0/article/details/536480
Django(二)路由系统、视图、模板的更多相关文章
- python第一百零五天 ---Django 基础 路由系统 URL 模板语言 ORM 操作
一 路由系统 URL 1 url(r'^index/',views.index) url(r'^home/', views.Home.as_view()) 2 url(r'^detail-(\d+). ...
- Day18 Django之路由系统、模板语言、Ajax、Model
一.路由系统 1.创建Django项目 django-admin startproject day18 cd day18 python3 manage.py startapp app01 2.app0 ...
- Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session
Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...
- python的Web框架:Django路由系统以及模板导入
Django的路由系统 当一个请求来到时 当一个请求来到时 1.首先到项目目录下的urls.py(根URLconf模块)中,查找路由规则: 2.根URELcof模块,里面定义了 urlpatterns ...
- Python学习(三十一)—— Django之路由系统
转载自:http://www.cnblogs.com/liwenzhou/p/8271147.html Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLc ...
- 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- Django之路由系统 Dj
Django之路由系统 Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...
- Django之 路由系统
Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...
- Django 基础 路由系统
Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...
- Django 的路由系统
Django 的路由系统 Django 的路由系统 路由层 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$',views.ho ...
随机推荐
- ConfirmCancelUtilDialog【确认取消对话框封装类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 对确认取消对话框的封装. 前提:调用对话框的Activity必须继承FragmentActivity及其子类(比如AppCompat ...
- SpringBoot进阶教程(二十二)集成RabbitMQ---MQ实战演练
RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.RabbitMQ是流行的开源消息队列系统,用erlang语言开发.Rab ...
- Hadoop3.2.0使用详解
1.概述 Hadoop3已经发布很久了,迭代集成的一些新特性也是很有用的.截止本篇博客书写为止,Hadoop发布了3.2.0.接下来,笔者就为大家分享一下在使用Hadoop3中遇到到一些问题,以及解决 ...
- 【设计模式+原型理解】第一章:使用Javascript来巧妙实现经典的设计模式
刚开始学习设计模式之前,我是没想说要学习设计模式的,我只是因为想学习JS中的原型prototype知识,一开始我想JS中为什么要存在原型这个东西?于是慢慢通过原型而接触到设计模式,后来发现我这个过程是 ...
- 权限管理系统之SpringBoot集成LayUI实现后台管理首页
万事开头难,昨天一直在构思用户权限管理系统怎么实现,实现哪些需求,采用什么技术等,也在网上百度了好多,计划使用SpringBoot + Mybatis + thymeleaf + LayUI + S ...
- 第66章 视频 - Identity Server 4 中文文档(v1.0.0)
第66章 视频 66.1 2019 January [NDC] - 使用ASP.NET Core 2.2和3.0保护Web应用程序和API 1月[NDC] - 为基于OpenID Connect / ...
- MySQL 笔记整理(17) --如何正确地显示随机消息?
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 17) --如何正确地显示随机消息? 如果有这么一个英语单词表,需要每次 ...
- 物联网RFID技术之应用ETC系统
背景 信息物理系统CPS通过集成先进的感知.计算.通 信.控制等信息技术和自动控制技术,构建了物理空间与信息空间中人. 机.物.环境.信息等要素相互映射.适时交互.高效协同的复杂系统, 实现系统内资源 ...
- 文件的基本管理和XFS文件系统备份恢复
4.1 Linux系统目录结构和相对/绝对路径 4.1.1系统目录结构 在WIN系统中,查看文件先进入相应的盘符,然后进入文件目录 在WIN中,它是多根 c:\ d:\ e:\ Linux ...
- 在HTML页面中有jQuery实现实现拼图小游戏
1.用jQuery实现拼图小游戏 2.首先获得td的点击事件.再进行交换位置 3.下面这种仅供参考 4.下面这些是HTMl标签 当这个世界变得越来越复杂的时候,内心最需保持一份简单一份纯真: