视图
重点
- HttpRequest
- 位置参数和关键字参数
- 查询字符串
- 请求体:表单数据,JSON数据
- 请求头
-
HttpResponse
-
HttpResponse
-
JsonResponse
-
redirect
-
-
类视图
-
类视图的定义和使用
-
类视图装饰器(难点)
-
视图介绍和项目准备
视图介绍
- 视图就是
应用
中views.py
文件中的函数 - 视图的第一个参数必须为
HttpRequest对象
,还可能包含下参数如- 通过正则表达式组获取的位置参数
- 通过正则表达式组获得的关键字参数
- 视图必须返回一个
HttpResponse对象
或子对象
作为响应- 子对象:
JsonResponse
HttpResponseRedirect
- 子对象:
- 视图负责接受Web请求
HttpRequest
,进行逻辑处理,返回Web响应HttpResponse
给请求者- 响应内容可以是
HTML内容
,404错误
,重定向
,json数据
...
- 响应内容可以是
-
视图处理过程如下图:
使用视图时需要进行两步操作,两步操作不分先后
- 配置
URLconf
- 在
应用/views.py
中定义视图
项目准备
-
创建项目+创建应用+安装应用+配置模板路径+本地化+mysql数据库+URLconf+视图
-
mysql数据库使用之前的book
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', # 数据库主机 'PORT': 3306, # 数据库端口 'USER': 'root', # 数据库用户名 'PASSWORD': 'mysql', # 数据库用户密码 'NAME': 'book' # 数据库名字 } }
-
URLconf
-
settings.py
中:指定url配置ROOT_URLCONF = 'bookmanager.urls'
-
项目中
urls.py
:只要不是admin/
就匹配成功,包含到应用中的urls.py
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^admin/', include(admin.site.urls)), # 只要不是‘admin/’就匹配成功,包含到应用中的urls.py url(r'^', include('book.urls')), ]
-
-
应用中
urls.py
:匹配testproject/
成功就调用views
中的testproject
函数,测试项目逻辑from django.conf.urls import url import views urlpatterns = [ # 匹配`testproject/`成功就调用`views`中的`testproject`函数 url(r'^testproject/$', views.testproject), ]
-
视图:测试项目逻辑
from django.http import HttpResponse # 测试项目逻辑 def testproject(request): return HttpResponse('测试项目逻辑')
-
在models.py 文件中定义模型类
from django.db import models
# Create your models here.
# 准备书籍列表信息的模型类
class BookInfo(models.Model):
# 创建字段,字段类型...
name = models.CharField(max_length=20, verbose_name='名称')
pub_date = models.DateField(verbose_name='发布日期',null=True)
readcount = models.IntegerField(default=0, verbose_name='阅读量')
commentcount = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'bookinfo' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.name
# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
name = models.CharField(max_length=20, verbose_name='名称')
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'peopleinfo'
verbose_name = '人物信息'
def __str__(self):
return self.name
1)生成迁移文件
python manage.py makemigrations
2)同步到数据库中
python manage.py migrate
3)添加测试数据
insert into bookinfo(name, pub_date, readcount,commentcount, is_delete) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);
insert into peopleinfo(name, gender, book_id, description, is_delete) values
('郭靖', 1, 1, '降龙十八掌', 0),
('黄蓉', 0, 1, '打狗棍法', 0),
('黄药师', 1, 1, '弹指神通', 0),
('欧阳锋', 1, 1, '蛤蟆功', 0),
('梅超风', 0, 1, '九阴白骨爪', 0),
('乔峰', 1, 2, '降龙十八掌', 0),
('段誉', 1, 2, '六脉神剑', 0),
('虚竹', 1, 2, '天山六阳掌', 0),
('王语嫣', 0, 2, '神仙姐姐', 0),
('令狐冲', 1, 3, '独孤九剑', 0),
('任盈盈', 0, 3, '弹琴', 0),
('岳不群', 1, 3, '华山剑法', 0),
('东方不败', 0, 3, '葵花宝典', 0),
('胡斐', 1, 4, '胡家刀法', 0),
('苗若兰', 0, 4, '黄衣', 0),
('程灵素', 0, 4, '医术', 0),
('袁紫衣', 0, 4, '六合拳', 0);