大纲

一、内容概要: 
二、上节回顾 
三、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(二)路由系统、视图、模板的更多相关文章

  1. python第一百零五天 ---Django 基础 路由系统 URL 模板语言 ORM 操作

    一 路由系统 URL 1 url(r'^index/',views.index) url(r'^home/', views.Home.as_view()) 2 url(r'^detail-(\d+). ...

  2. Day18 Django之路由系统、模板语言、Ajax、Model

    一.路由系统 1.创建Django项目 django-admin startproject day18 cd day18 python3 manage.py startapp app01 2.app0 ...

  3. Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session

    Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...

  4. python的Web框架:Django路由系统以及模板导入

    Django的路由系统 当一个请求来到时 当一个请求来到时 1.首先到项目目录下的urls.py(根URLconf模块)中,查找路由规则: 2.根URELcof模块,里面定义了 urlpatterns ...

  5. Python学习(三十一)—— Django之路由系统

    转载自:http://www.cnblogs.com/liwenzhou/p/8271147.html Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLc ...

  6. 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  7. Django之路由系统 Dj

    Django之路由系统   Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...

  8. Django之 路由系统

    Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...

  9. Django 基础 路由系统

    Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...

  10. Django 的路由系统

    Django 的路由系统   Django 的路由系统 路由层 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$',views.ho ...

随机推荐

  1. java基础(十八)----- java动态代理原理源码解析

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 静态代理 1.静态代理 静态代理:由程序员创建或特定工 ...

  2. 使用 ASP.NET Core MVC 创建 Web API(三)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 十 ...

  3. Webpack 4教程 - 第四部分,使用SplitChunksPlugin分离代码

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/06/04/code-splitting-with-s ...

  4. 什么是5G,看了这篇文章你就彻底懂了

    人类已经经历了六次信息技术革命为: 第一次:语言的使用 让信息可以分享 第二次:文字的创造 让信息可以记录 第三次:印刷术的发明 让信息可以传得更远 第四次:无线电的发明 让信息可以远距离实时传输 第 ...

  5. C#的dapper使用

    Dapper是一款轻量级ORM工具(Github).如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀.你又觉得ORM省时省 ...

  6. [MySQL] mysql的逻辑分层

    mysql逻辑分层:1.client ==>连接层 ==>服务层==>引擎层==>存储层 server2.连接层: 提供与客户端连接的服务3.服务层: 1.提供各种用户使用的接 ...

  7. Springboot整合activemq

    今天呢心血来潮,也有很多以前的学弟问到我关于消息队列的一些问题,有个刚入门,有的有问题都来问我,那么今天来说说如何快速入门mq. 一.首先说下什么是消息队列? 1.消息队列是在消息的传输过程中保存消息 ...

  8. Odoo 开源微信小程序商城模块

    详见:http://oejia.net/blog/2018/09/13/oejia_weshop_about.html oejia_weshop Odoo 微信小程序商城模块 oejia_weshop ...

  9. Jmeter使用JDBC请求简介

    1.现在oracle或mysql的jdbc然后放到jmeter的lib路径下 2.添加jdbc默认请求控件. 3.添加jdbc请求 4.发送 5.出现ORA-00911错误是由于sql语句错误,注意别 ...

  10. 1 minute教会你shell

    Shell模板 #!/bin/bash ####################################################### # $Name: shell_template. ...