django之ORM,F查询Q查询及知识补充

F查询与Q查询

导入:from django.db.models import F,Q

F查询-->针对数值操作,引用字段,字段和字段作比较
字段a=F("字段B")*num --> 字段A和字段B作比较,后面可以加逻辑运算

Q查询-->&与 |或 ~
Q(name="xxx")|Q(name="yyy")


Django
MTV
V:url配置
T:模板
M:model(ORM查询) *****

Ajax

cookie session

form组件

博客系统(*****


知识补充:
cookie:保存在浏览器的键值对
session(是和cookie一起工作的):保存在服务端的键值对

设置session的流程-->POST请求,当登陆成功之后设置
request.session["key"]=True
1、set_cookie("seeionID":"随机字符串")
2、数据库中的django_session表中插入一条数据
session_key --> 随机字符串
sessiondata --> {"key":True}

取session的流程-->GET请求,浏览器请求非登录页面的时候
request.session.get("key")
1、request.COOKIE.get("sessionID") --> 拿到随机字符串
2、django的session表中做过滤
session_user = session.objects.filter(session_key="随机字符串").first()
ret = session_user.session_data.get("key")


用户认证系统
auth 模块 --> Django自动创建User

from django.contrib import auth --> 导入auth模块

python manage.py createsuperuser --> 创建超级用户

from django.contrib.auth.models import User 导入存放用户信息的User

auth的API
1、auth.authenticate() --> 验证函数
user = auth.authenticate(username=user,password=pwd) --> 找到user表,给密码加密之后验证
返回的是一个对象
2、auth.login() --> 插入session记录
auth.login(request,user) --> request.session["user"]=user

request.user --> 用户是登录状态,显示当前登陆的user对象
request.user --> 用户是未登录状态,是一个匿名对象

3、auth.logout() --> 删除session记录
auth.logout(request) --> request.session.flush()

User的API
1、 request.user.is_authenticated() --> 判断是否登录,返回True False

2、 注册
User.objects.create_user(username=user,password=pwd) --> 注册,添加用户
User.objects.create_superuser(username=user,password=pwd) --> 注册,添加用户

3、修改密码
user = User.objects.get(username)
user.set_password(new_password) --> 修改密码
user.save()

Ajax
基于jQuery的AJAX
$.ajax({
url: "/URL/",
type: "POST",
data: {"name": "alex"}, --> js的objects对象


contentType:"application/x-www-form-urlencoded", // 默认值

success: function(data){
// data就是后端发过来的数据字符串
// 前端做反序列化
var dataObj = JSON.parse(data) // 把收到的字符串反序列化成对象
dataObj["status"] // 就可以拿到具体的值
dataObj.status
},

error:function(){

}
})


contentType参数是 --> 传递这次请求的格式
默认值:"application/x-www-form-urlencoded", --> 对应的格式:"user=alex&pwd=123"

json字符串:"application/json"
--> 这种格式的传递,request.POST和request.GET中是没有数据的


后端拿数据 -- request.body --> 所有的请求的数据,字节类型
request.POST --> 字典类型
request.GET --> 字典类型

非urlencoded的请求格式Django都不会给request.POST和request.GET赋值
在后端取值的时候,先转utf8类型,然后json反序列化成字典,按字典的形式取值

$.ajax({
type:"POST/GET" --> $.post/get({})
})

jQuery.serialize()
$.serialize()函数用于序列化一组表单元素,将表单内容编码为用于提交的字符串。

$.("form表单").serialize() --> 自动组装form表单的数据
$.("只传一部分(查到要传的标签)").serialize() --> 自动组装form表单的数据




csrf_token:
解决方法:

方式2
<form>
{% csrf_token %}
</form><br>

$.ajax(
data:{
"csrfmiddlewaretoken":$("[name='csrfmiddlewaretoken']").val();
}
})

方式3:非urlencoded的请求格式,中间件,CSRF不识别,会forbidden掉,用这个方式

<script src="{% static 'js/jquery.cookie.js' %}"></script> --->要先引入jquery.cookie.js才能用$.cookie()     $.ajax({
      headers:{"X-CSRFToken":$.cookie('csrftoken')},
      或:headers:{"X-CSRFToken":$("[name='csrfmiddlewaretoken']").val()},
    })












posted @ 2017-12-12 17:25  chitalu  阅读(72)  评论(0)    收藏  举报