0%

Python|django框架入门2

django框架第二弹,一起来学习视图和模板吧!!!

探究视图

视图负责处理用户请求和生成相应的响应内容,然后再页面中显示

构建网页内容

1.响应类型

视图函数return具有多种响应类型

响应类型 说明
HttpResponse(‘Hello world’) HTTP状态码200,请求已成功被服务器接收
HttpResponseBadRequest(‘BadRequest’) HTTP状态码400,访问的页面不存在或者请求错
HttpResponseForbidden(‘NotFound’) HTTP状态码404,网页不存在或网页的URL失效
HttpResponseForbidden(‘NotFound’) HTTP状态码403,没有访问权限
HttpResponseNotAllowed(‘NotAllowed Get’) HTTP状态码405,不允许使用该请求方式
HttpResponseServrError(‘ServerError’) HTTP状态码500, 服务器内容错误

响应类型是服务器告诉客户端当前网页请求发生了什么,其属于django.http模板,该模板可以用于实现文件下载

2.生成html网页

django.http模板可以通过render()函数跳转生成html文件

1
render(request, template_name, context = None, content_type = None, status = None, using = None)

参数说明

相关参数 介绍
request 浏览器向服务器发送的请求对象(不用修改)
template_ name HTML 模板文件名
context 对HTML模板的变量赋值,以字典格式表示,默认情况下是一个空字典
content_ type 一般情况使用默认值,不用修改
status HTTP状态码,默认为200,可以指向404页面
using 设置HTML模板转换生成HTML网页的模板引擎
3.案例

在app目录下创建templates存放html模板,static存放html的静态资源

编写urls.py生成URL信息

1
2
3
4
5
6
from django.urls import path,re_path #引入re_path功能模板
from .import views

urlpatterns = [
path('',views.index), #首页URL
]

编写视图函数生成html网页

1
2
3
4
from django.shortcuts import render #引用render模板

def index (request) :
return render(request, 'index.html', context={'title': '首页'})

数据可视化

视图的功能:

  • 接收用户请求和返回响应内容
  • 与模型(Model) 实现数据交互(操作数据库)
  • 视图相当于一个处理中心,负责接收用户请求,然后根据请求信息读取并处理后台数据,最后生成HTML网页返回给用户。

该部分的内容涉及到数据库,详细的内容会在下一篇文章介绍

1.创建数据库

视图操作数据库实质是从models.py导入数据库映射对象

(1)在app的models.py文件编写,将Product类和数据表Product构成映射关系

1
2
3
4
5
6
from django.db import models

class Laopo (models .Model) :
id = models.IntegerField(primary_key = True) #对应整型类数据
name = models.CharField(max_length = 50) #对应字符类数据,最大长度为50字节
type = models.CharField(max__length = 20)

(2)在Navicat for MySQL工具,先新建数据库,再到setting.py文件设置数据库连接信息

1
2
3
4
5
6
7
8
9
10
11
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydata', #名字与在Navicat新建的对应
'USER' : 'root' ,
'PASSWORD' : '1234', #密码填自己注册MySQL时写的密码
'HOST' : '127.0.0.1',
'PORT':'3306',
},
}

(3)上述代码只构成了两者间的关系,在数据库中并没有生成相应数据表

生成用于创建数据表的文件(在项目下调用)

1
python manage.py makemigrations

该指令用于生成index定义的模型生成0001_initial.py文件,形成生成数据表的脚本代码

1
python manage.py migrate

该指令根据脚本代码在目标数据库生成对应数据表(要重新连接刷新数据库)

实现效果如下(要打开mysql服务才能成功连接)

其中的index_product对应的就是我们自己在models.py中定义的Product类,通过Navicat工具在其中添加数据,如图

2.视图函数处理

视图函数将数据与模板连接,实现数据可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.shortcuts import render #引用render模板


def index(request) :
type_list = Laopo.objects.values('type').distinct() #查询type的数据并去重
name_list = Laopo.objects.values('name','type') #查询type和name的全部数据
#将读取到的数据用context字典储存起来
context = {'title':'首页', 'type_list': type_list, 'name_lsit':name_list}

#变量context的内容是render()函数的参数值,把变量传给HTML
return render(request, 'index.html', context=context, status=200)


3.使用模板插入数据

模板与标签的内容下一篇文章再细讲

在html插入动态数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for type in type_list %}
<p>
{% for name in name_list %}
{% if type.type == "傲娇"}
{% name.name %}是个傲娇
{% endif %}
{% endfor %}
</p>
{% endfor %}
</body>
</html>
4.总结

实现数据可视的步骤:

  • 定义数据模型
  • 在视图导入模型所定义的类(数据表对象)
  • 视图函数再获取数据后,将数据传递给html模板

获取请求信息

视图是用于接收并处理用户请求信息,并且信息储存在参数request中

1.常用属性

最重要的是GET,POST和method三个

2.实例

编写url.py路径

1
2
3
4
5
6
from django.urls import path 
from .import views

urlpatterns = [
path('login.html',views.login),
]

编写视图函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.shortcuts import HttpResponse #引用render模板

def login(request):
#post请求的情况
if request.method == 'POST':
name = request.POST.get('name')
# 绝对路径,完整的地址信息
# return redirect( 'http://127.0.0.1:8000/')
# 相对路径,代表首页地址
return redirect('/')

#get请求的情况
else:
if request.GET.get('name'):
name = request.GET.get('name')
else:
name = ' Everyone '
return HttpResponse('username is ' + name)


  • 首先使用method对用户的请求方式进行判断,一般来说用户访问某个URL地址都是GET,输入信息和点击按钮是POST
  • 判断后,用GET或POST的方式获取请求参数
  • http:/ /127.0.0.1 : 8000/ login. html ?name=Tom 中GET的请求参数以?为标识,等号前为参数名,等号后为参数值

通用视图

Django可以通过通用视图快速完成数据视图的开发,它是通过定义和声明类的形式实现的

用途
TemplateView 返回HTML模板
ListView 将数据库的数据传递给HTML模板,通常获取某个表的所有数据
DetailView 将数据库的数据传递给HTML模板,通常获取数据表的单条数据

深入模板

django作为web框架,可以使用模板去动态生成HTML网页。django的模板语言有其内置的DTL和最流行的Jinja2,以下主要介绍的是内置的模板语言DTL

变量与标签

1.Django内置标签
标签 介绍
name是变量名,用于插入变量数据,可以是字符串型和整型
{% for %}` | 遍历输出变量的内容,变量类型多为列表 | | `{% if %}` | 对变量进行条件判断 | | `{% csrf_ _token %}` | 用于防护跨站请求伪造攻击 | | `{% url %}` | 引用路由配置的地址,生成相应的URL地址 | | `{% static %}` | 读取静态资源的文件内容 | | `{% extends xxx %}` | 模板继承,xxx为模板文件名,使当前模板继承xxx模板 | | `{% block xxx %}` | 重写父类模板的代码 | 注意`{% for %}`要用`{% endfor %}{% if %}`要用`{% endif %}结束
2.for标签变量

为了方便for的索引,模板还提供一些特殊的变量来获取for标签循环的信息,把for做出数组的效果方便读取信息

变量 描述
forloop.counter 获取当前循环的索引(即第几个数据),从1开始计算
forloop.counter() 获取当前循环的索引,从0开始计算
forloop.revcounter 索引从最大数开始递减,直到索引到1位置
forloop.revcounter() 索引从最大数开始递减,直到索引到0位置
forloop.first 当遍历的元素为第一项时为真
forloop.last 当遍历的元素为最后一-项时为真

模板继承

即存在一个html文件的内容,可以在其他html中共用(如header和footer这些)

使用方法很简单:

  • 在index.html中使用{% extends "base.html" %}来继承base.html的代码
  • {% block body %}`在继承模板的基础上实现自定义模板内容 - `{% endblock %}结束block标签

相当于在共用模板中插入{% block body %}`与`{% endblock %}间的内容

过滤器

过滤器是对变量内容进行处理,把变量的数据格式与内容转化成我们想要的效果,其使用方法为

1
{{variable|filter}}

过滤器处理变量variable,Django中有许多内置的过滤器