全栈学习(OB)
1. 模板语言 if条件语句
2. Form表单提交,页面会刷新
3. Ajax提交,页面不刷新
4. js实现页面跳转
5. 两种准备更改页面数据的方式
模态对话框
- 数据少
- 少量输入框
- used for: 登录
新url方式
- 数据量大
- 操作多
- used for: 博客编辑
6.js阻止默认事件发生
7.location.reload() 页面刷新
8.HttpResponse(json.dumps(xxxx))
9.JSON.parse()
10.jQury阻止默认事件发生
11.placeholder=“xxxx”
对话框内部引导半显示文字
12.老师表与班级表(多对多)
添加新老师,前端输入的老师名称通过 request.POST.get(xxx) 获得;
添加新老师,前端所选的多个班级通过 request.POST.getlist(xxxx) 获得。
13.SqlHelper封装(连接数据库–数据库操作–关闭连接)
class SqlHelper(object):
def __init__(self):
self.connect()
def connect(self)
self.conn = pymysql.connect(host='127.0.0.1',
port=3306,
user='root',
passwd='',
db='my_db')
self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
def get_one(self, sql, args)
pass
def get_lsit(self, sql, args)
pass
def modify(self, sql, args)
pass
def multi_modify(self, sql, args)
pass
def close()
self.cursor.close()
self.conn.close()
14. Ajax发送数据 traditional = True 我们可以通过设置traditional 为true阻止深度序列化,
例如:前端传的数据为class_list = [1, 2, 3], traditional默认为False时,后端通过request.POST.getlist获取不到数据, 当设置为True时,才可以获取到[1, 2, 3]
15.js里判断一个元素在不在列表 (python里有 in ,js里没有。)
eg:判断 2 在不在v = [1, 2, 3], 用 v.indexof(2)
16. CSS中的 响应式
@media(xxx){XXXXX
}
应用: (1)导航条; (2)栅格
17. Django母版
母板 里放所有页面共用的东西
子板 继承母板, 可自定义当前页面私有的东西
{% block xx %}
{% endblock %}
18.设置过期时间
redis 设置过期时间
-
EXPIRE key 秒数 # 多少秒后过期
session保存在数据库,通过
request.session.set_expiry(value)
设置过期时间
cookie中过期时间的设置有两种:
max_age = 10
# 10秒后过期expires = 日期
# 到某个日期过期
19.明文cookie与签名cookie
明文cookie的设置与获取
obj.set_cookie(...)
request.COOKIE.get(...)
签名cookie的设置与获取
obj.set_signed_cookie(... ...)
request.get_signed_cookie(... ...)
20.CSS 中 hover
当鼠标移动到xx样式的标签上时,其子标签**.g**应用以下属性
.xx:hover .g{ YYYY
}
21. CharField必须设置 max_length 不然会报错
22.Django ORM 数据库操作
查询
models.UserInfo.objects.all() ==> 返回QuerySet对象 [obj_1, obj_2], 类似列表,每个对象代表数据表一行数据,可以用 for obj in [obj_1, obj_2] 遍历出每一个对象, 再用obj.id、obj.name … 获取每个字段的具体数据。
models.UserInfo.objects.filter(id=2) ==> 过滤() # 注意这时得到的结果还是QuerySet对象
models.UserInfo.object.filter(id=2).first() ==> # 这时得到的结果就是obj 对象了,
models.UserInfo.objects.filter(id__gt=2) ==> _ _gt过滤得到大于某一值的 - -lt 过滤得到小于某一值的
增加
models.UserInfo.objects.create(name=‘赵六’) ==> 增加一行数据name字段为 ‘赵六’
更改
models.UserInfo.objects.filter(id=2).update(name=‘李四’) ==> 将id=2这一行的name (张三) 改为 ‘李四’
删除
models.UserInfo.objects.filter(id=2).delete() ==> 删除id=2的一行数据
============================================================
其他
v = models.UserInfo.objects.filter(id__gt=2).value('ut_id').annotate(xxxx=Count(id)).filter(xxxx__gt=2)
print(v.query)
结果为:
SELECT "app01_userifo"."ut_id", COUNT(“app01_userinfo"."id" AS "xxxx" FROM "app01_userinfo" WHERE "app01_userinfo"."id" > 2 GROUP BY "app01_userinfo"."ut_id" HAVING COUNT("app01_userinfo"."id") > 2
F
Q
23. Django orm 帮咱们解决不了问题时,还可以使用:extra、 原生sql、 raw
extra
24.路由请求过来,通过反射来找到相应函数,getattr, 一般不会通过if…else来做。
25.外键关联时的操作
26.数据获取多个数据时
注意对象可以直接用 . 来进行跨表操作,而字典和元组对象要在查询时用 __ 来进行跨表操作
1.得到的QuerySet里面是对象形式 [obj1, obj2, obj3]
2.得到的querySet对象是字典格式 [{id:1, name:‘zs’}, {id:2, name:‘ls’}, {id:3, name:‘ww’}]
3.得到的QuerySet对象里面是元组格式 [(1, ‘zs’), (2, ‘ls’), (3, ‘ww’)]
27. django原生分页只适合做 上一页 下一页,如果显示页码会所有页码都显示出来,要想只显示当前页码和前后几页,还需要做二次开发。当然可以不用django里的分页,来自定分页组件。
在此之后,还得再做处理(1.为方便调用,2.为显示页码) ,效果如下图:
28. 写原生SQL语句选择连接的数据库
from django.db import connection, connections
cursor = connection.cursor() # 默认 connection = defaul t 连接“default”数据库
cursor = connections(‘db2’).cursor() # 对应settings里面的数据库配置,此项是连接 “db2” 数据库
29. .all().first() 和 .get()
v = models.UserInfo.objects.all().first() # 有数据 返回一条,没有 则返回None
v = models.UserInfo.objects.get() # 有数据 返回一条, 没有 会报错!
30. django中从数据库提取某一字段下的值为空的数据时
不能用 filter(age=None)
得用 filter(age__isnull=True)
31.多对多时所需的 第三张关系表的定义方式
32. Django 中 csrf 防护的开启与禁用
全局禁用:
注释掉 # ‘django.middleware.csrf.CsrfViewMiddleware’
局部禁用:(全局开启情况下)
在要禁用的方法上加装饰器 @csrf_exempt
局部使用:(全局禁用情况下)
对于FBV 在要使用的方法上加装饰器 @csrf_protect
对于CBV 必须再类上加 @method_decorator(csrf_protect,name=‘dispatch’),而不能直接装饰类中定义的方法。name=‘ ’可以填类中的某个方法例如:post
33. 数据库建表时,的字段设置
例如: email = models.EmailField( null=True, default = ’11111‘, unique=True, blank=True, verbose_name=‘邮箱’)
其中null=True是告诉数据库这个字段可以为空,而blank=True是告诉Django admin 这个空可以不填
verbose_name 是Django admin 显示的这一字段 行前面的名称。
34. Session 可在Django项目 settings.py 文件中添加的配置
以下是默认设置:
35. Session 可以配置存储位置(session数据放在什么地方)
可存在1.数据库(默认)、2.文件、3.缓存、4.缓存+数据库(优先从缓存中取,没有就到数据库取)、5cookie中
36. Django生命周期
客户端输入地址,请求会先进过uwsgi,然后到达web框架,中间件从上到下执行,然后经过url路由匹配找到视图,执行视图函数,返回响应时再经过中间件,这次是从下到上执行,然后返回给客户端。
中间件的process_request 不能有返回值,如果某一个中间件有返回值,则程序不会再经过下面中间件,会直接再该中间件返回,(自行脑补图片,**注意:**Django1.7、1.8版本中间件返回会从最底部中间件开始返回,而不是从当前的中间件返回。);
中间件的process_response 必须有返回值,这样才能返回给客户端呀。
37. django 的 Form 表单验证,is_valid()
继承关系:
Field <== { IntegerFiled | CharField } <== { EmailField | URLField | … }
=======================
========================