Django框架02

day17 2018-08-12

Django框架02

1. 今日内容:
1. 新建Django项目梳理
1. 模板文件路径配置
2. 数据库配置
3. 静态文件配置
4. 注释掉csrf中间件那一行
2. Django默认sqlite3数据库的简单用法

3. 路由系统进阶:https://www.cnblogs.com/liwenzhou/articles/8271147.html


- 动态路由
urls.py中通过正则表达式的分组匹配,捕获用户访问的url中的值,传递给视图函数
分组匹配:
相当于给视图函数传递 位置参数
分组命名匹配:
相当于给视图函数传递 关键字参数

- name
防止将url硬编码到我们的业务逻辑代码中,给url起别名
通过别名,反向找到 url
在views.py中:
from django.urls import reverse
具体的url = reverse('url别名')

4. 视图函数进阶:https://www.cnblogs.com/liwenzhou/articles/8305104.html
1. views.py
1. 基础必会三件套
1. HttpResponse('字符串')
2. render(request, "xx.html", {"key": value})
3. redirect("/其它的url/")
2. FBV(Function Base View) 基于函数的视图
通过request.method == "POST" 去判断

3. CBV(Class Base View) 基于类的视图
1. 必须继承views.View --> from django import views
2. 写一个自己的视图类
3. 通过定义不同的方法,来处理用户不同的请求
4. 在urls.py中注册视图的时候要写 views.类名.as_view()


2. request对象的常用属性和方法
request表示的是和用户请求相关的所有数据
1. request.method --> 用户当前请求的请求方法
2. request.GET --> 用户请求中url中的参数
3. request.POST --> 用户POST请求的数据
4. request.path_info --> 用户访问的url路径是什么



3. Django上传文件
1. 前端页面
1. form表单一定要有action,method必须是post
2. 一定要配置enctype="multipart/form-data
2. 后端:
def post(self, request):
# 拿到用户发送的文件数据
file_obj = request.FILES.get("code")
# 保存下来
# 1. 拿到用户上传的文件名
filename = file_obj.name
# 2. 在服务端创建一个同名的文件
with open(filename, "wb") as f:
# 3. 从用户上传的文件对象中一点一点读数据,往我本地创建的文件句柄里一点一点写
for i in file_obj.chunks():
f.write(i)
return HttpResponse("上传成功!")

4. JsonResponse
专门用来返回JSON格式数据的响应对象
from django.http import JsonResponse

5. 模板引擎进阶:https://www.cnblogs.com/liwenzhou/p/7931828.html
1. 已经学过的Django模板语言的语法
1. 两个语法:
1. {{ }} --> 跟变量相关的操作
2. {% %} --> 跟逻辑相关的操作
2. 变量相关
1. 传字典或对象类型的数据 obj.name/obj.age
2. 传数组类型的数据 obj.索引值
3. 日期格式化
<p>{{ today|date:"Y-m-d H:i:s"}}</p>
4. 显示真正的html代码
<p>{{ link|safe }}</p>
2. 母板
1. 为什么要用母版?
不同的页面有大量重复的代码,我们可以把公用的部分提取出来放在单独一个文件
2. 怎么使用?
1. 在子页面 通过使用 {% extends ‘模板名’ %} --> 放在子页面的最上面
2. {% block xx %}{% endblock %}
3. 组件
把单独的一段html代码放在一个文件
使用 {% include '组件名' %}导入

6. CSRF
1. 为什么要有csrf_token?
2. Django中如何使用?
在render的页面上写上{% csrf_token %}
3. 如果是form表单形式提交,必须放在form表单中


7. ORM单表查询13条+外键操作(一对多):
1. ORM上周知识点:
1. 查询
1. 查所有
models.Publisher.objects.all()
2. 查某个具体的记录
models.Publisher.objects.get(id=1) --> 注意查询条件不成立就报错
2. 删除一条记录
models.Publisher.objects.get(id=1).delete()
3. 创建一条记录
models.Publisher.objects.create(name="新出版社名字", addr="出版社地址")
4. 修改一条记录
obj = models.Publisher.objects.get(id=1)
obj.name = "新名字"
obj.save()

2. 字段和参数: https://www.cnblogs.com/liwenzhou/p/8688919.html
1. 上周字段和参数:
1. models.AutoField(primary_key=True)
2. models.CharField(max_length=32)

2. 常用字段和参数
1. 字段
1. CharField
2. AutoField
3. DateField

4. DateTimeField()
5. IntergeField()
2. 参数
1. null=True
2. default=默认值
3. unique=True
4. 时间字段
1. auto_now_add=True 第一次创建时
2. auto_add=True 每次更新时

3. ORM必知必会单表查询13条
1. all() --> 查询所有结果
2. filter() --> 根据查询条件查询数据库的
3. get() --> 获取一个唯一的值
4. exclude() --> 将符合条件的都剔除掉,留下不符合条件的
5. values('字段名', ...) --> 返回一个QuerySet,里面是字典
6. values_list(字段名', ...) --> 返回一个QuerySet,里面是元祖
7. order_by() --> 对查询结果排序
8. reverse() --> 对一个有序的查询结果集做反转
9. distinct() --> 去重,跨表查询时去掉重复的记录,MySQL不支持按字段去重
10. count() --> 返回数据条数
11. first() --> 取第一个数据
12. last() --> 取最后一条数据
13. exists() --> 判断表里有没有数据


分类:
1. 返回QuerySet列表的有哪一些?
1. all()
2. filter()
3. exclude()
4. order_by()
5. reverse()
6. distinct()

7. values('字段名', ...) --> 查询结果的列表里,都是字典
8. values_list(字段名', ...) --> 查询结果的列表里,都是元祖

2. 返回具体对象的
1. first()
2. last()
3. get()

3. 返回数字的
1. count()
4. 返回布尔值
1. exists()

4. 单表查询神奇的双下划线
查询操作:https://www.cnblogs.com/liwenzhou/p/8660826.html

1. 外键 ForeignKey
通过Foreignkey字段 ,能够得到和我关联的那个对象
数据库中保存的字段名是 外键字段_id
2. 外键增删改查
3. 跨表查询
1. 基于对象的查询
1. 正向查
2. 反向查
2. 基于QuerySet的查询
1. 正向查
2. 反向查


8. cookie&session:https://www.cnblogs.com/liwenzhou/p/8343243.html
1. Cookie
1. 是什么?
保存在浏览器端的键值对!
服务端在返回响应的时候,告诉浏览器保存的键值对!浏览器可以拒绝保存Cookie.

2. 为什么要有cookie?
HTTP请求是无状态的,我们需要保存状态 --> cookie

3. Django中cookie的使用
1. 设置cookie
rep = HttpResponse("ok")
rep.set_cookie("key", "value", max_age=xx秒)
rep.set_signed_cookie("key", "value", salt="ooxx", max_age=xx秒)
2. 获取cookie
request.COOKIES.get("key")
request.get_signed_cookie("key", default="", salt="ooxx")
3. cookie有失效时间
1. Django中不设置,关闭浏览器就失效了
2. 通过max_age设置超时时间

4. 补充3点:
1. 如何登陆后再跳转回之前访问的页面 --> next参数实现
2. 如何将FBV的装饰器应用到CBV上 --> from django.utils.decorators import method_decorator
3. 装饰器修复技术 --> from functools import wraps

 小知识点集合:

1、连接sqlite数据库

1、如何在一个.py文件中,使用Django项目的相关配置或内容

 2、如果数据库里有数据了,再去修改数据库的字段,就会弹出这个框

3、在关联表的时候,Django2.0中需要明确指定on_delete这个选项

创建书籍:

 


2. session
1. 保存在服务端的键值对!
下周讲!

2. 练习题:
1. django请求生命周期
2. values和values_list的区别?
3. session和cookie是什么?以及区别?
4. django路由系统中name的作用?
5. filter和exclude的区别?
6. ORM查询示例:
表结构:
出版社表:
ID 名称
图书表:
ID 书名称 价格 出版社ID
题目:
1. 查询老男孩出版社出版过的价格大于200的书籍
2. 查询所有以py开头的书籍名称
3. 查询价格为50,100或者150的所有书籍名称及其出版社名称
4. 查询价格在100到200之间的所有书籍名称及其价格
5. 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
6. 查询价格大于200的书籍的个数
7. 查询价格不等于100的所有书籍


3. 作业:主机管理【02】:主机管理
1. 基于django创建表:
用户表:ID、用户名、密码

业务线表:ID、名称

主机表:ID、主机名、密码、业务线ID

2. 主机管理:增删改查(一对多,不需要做业务线管理,只要在数据库录入业务线数据即可)

3. 使用母板和动态路由
4. 套用BootStrap样式

采分点:
练习题:20
实现所有功能:70
代码写的清晰、健壮、可扩展:10

猜你喜欢

转载自www.cnblogs.com/lucky-penguin/p/9466170.html