notice!!!!!!!!!!

ajax是什么?是用js异步传输xml语言. ajax是浏览器向服务端发请求的一种方式.


urlencoded类型的请求数据放在request.POST中,json格式的数据从request.body中获取,request.POST中为空.上传文件的formdata类型的数据放在request.FILES中,


设置cookie: http_response_obj.set_cookie('is_login':1,max_age=60*60*7)
后台获取cookie: request.COOKIES.get('is_login')

数据库初始化迁移的时候默认有一堆表,其中一个auth_user表, 是django自带的认证表,必须使用djaong的用户表auth_user 才能用认证组件
导入 from django.contrib import auth
from django.contrib.auth.models import User
一些方法创:建超级用户pyhton manage.py createsuperuser
认证是否有这个用户auth.authenticate(username=xxx,password=xxx)
查询成功返回user_obj,
查询失败返回none
auth.login(request,user_obj)
login本质是做了request.session['user_id']=user_obj.pk
request.user=user_obj
request.user
没login前request.user默认是匿名用户对象,
auth.login()后 request.user就是当前登录用户obj
requet.user是全局变量,在模板中,视图中都可以直接使用
request.user.id
request.user.username
request.user.is_acitive
auth.logout(request) 注销
本质做的是request.sesion.flush()
auth.login(request,user_obj) login本质是做了request.session['user_id']=user_obj.pk
# request.user就是当前登录用户object
没loing前request.user默认是匿名用户对象,auth.login()之后就是当前登录用户对象.
Django将请求解包成reqeust对象.每次请求都会解包成一个request对象,上次的request对象已经结束了.所以user不能存在requst中只能存在session里,每次请求来的时候会从session中取. 如果没有登录reques.user就是匿名对象,如果登录了就将request.user=user_obj, use_obj就是auth_user表的一条记录.


MVC,全名是Model View Controller,是一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有低耦合性低、高重用、生命周期成本低等优点。
MTV: Django的MTV框架的设计模式借鉴了各大语言都通用的模型MVC框架的思想,也将软件架构分成三部分,来降低各个部分之间的耦合性。
Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template

另外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template.


# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 删除当前会话的所有Session数据
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout() 函数中就会调用它。

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

如果要添加响应头信息, 如何添加?
Httpresponse对象[xx] = xx
即 响应对象按字典形式添加内容
def login(request):
ret = HttpResponse('okkk') # 响应体内容为okkk
ret['name'] = 'alex' # 在响应头中添加name = alex 那么在响应头中就可以看见name:alex
return ret
在响应头中添加cookie
ret.set_cookie('logined', 'yes')

总结:
外键正向查:找书的出版社.
方法1.基于对象: 对象.关联字段.字段, book_obj.publisher.name
方法2.基于双下: 关联字段__字段, publisher__name

外键反向查: 找出版社有哪些书
方法1.基于对象:obj.小写表名_set, publisher_obj.book_set.all() --反向查用小写表名_set,等价于publisher_obj.books.all()
方法2.基于双下:表名__字段, Publisher结果集.values_list("books__title")
(ps:结果集才有values或value_list方法,单个对象没有这个方法)

用auth模块,先authenticate(username=username,password=password),认证后再login(request,user)才是登录,login之后才会生成session.auth模块登录后自动写session.
如果不用auth模块,要在通过数据库查询后后自己写session: if user_obj: request.session['is_login':1]


rediret('/login/')的本质是给响应设置响应头,让他定位到另一个页面.

获取不加盐的cookie
request.COOKIES['key']
获取加盐的cookie
request.get_signed_cookie(key,default=RAISE_ERROR,salt='', max_age=None) --参数:
default: 默认值
salt: 加密盐
max_age: cookie在浏览器中的有效期 多少秒

为什么要用httpResponse对象设置cookie,因为cookie的本质是设置http响应头headers,所以要用http对象来设置.


res={xx:xx,xx:xx}
return JsonResponse(res) #JsonResponse自动给res反序列化再发送

ajax总结:
ajax基于js和xml:使用js用异步的方式传输xml的格式.
他的异步体现在,发了一个请求不用等结果,就发另一个请求.
$.ajax中发送data{},在视图函数中有request.POST.get('key')来取;
如果data的字典中,有键值对的value是非字符串,要stringfy序列化,在视图函数中json.loads反序列化取;
视图函数中return JSONresponse和response的区别:JSONresponse会自动反序列化.如果用response需要HttpResponse(json.dumps(res));
$.ajax({url:xxx,type:xxx,data:{k1:v1,k2:v2}}, data中有非基本数据类型,要先序列化
success:function(){}, # success—回调函数,操作成功执行的函数
error:function(){}) # error--回调函数,操作失败的函数,成功还是失败根据返回的状态码判断
ajax发请求的时候不通过form,所以可以不用form表单
怎么发ajax?jquery中: $.ajax(….)


使用form流程:
写一个form类.,继承forms.Form,里面写字段,如name,pwd 字段对应html的name
视图函数中创建form对象. form_obj = RegForm()空form表格 或 form对象= form类名(request.POST) 把POST提交的数据传到form表单中.
is_valid校验通过后,cleaned_data取数据.
模板中用{form_obj}渲染出form表单
{{ form_obj.as_p }} ——》自动生成多个p标签 包含label input框
{{ form_obj.user }} ——》 生成某个字段的input框
{{ form_obj.errors }} ——》表单的所有错误信息,放ul和li里面
{{ form_obj.user.errors }} ——》 某个字段的所有错误信息
{{ form_obj.user.errors.0 }} ——》 某个字段的错误信息的第一个,比如长度不够格式也不对,只显示第一个错误长度不够.

form表单的select下拉框的choices取值问题:下拉框取值的3种取法.
1.取固定的choices.
widget = widgets.Select(choices=((1, 'alex'), (2, 'max'), (3, '云凤丁')))) # 固定的choice
2.从数据库中某个字段.
widget=widgets.Select(choices=models.Campuses.objects.values_list('id', 'name')) # 从数据库中取. 但是弊端是无法实时更新,要实时更新需要重写init
3.用ModelChoiceFeild类型
用ModelChoiceFeild可以实时更新,但是下拉框只显示object不能显示中文,要显示中文需要重写__str__方法.如果表单中有2个以上的ModelChoiceFeild就没法处理.所以不推荐使用.

style="background-color: #20e940;"

style="background-color: #1dd5b0;"


form常用字段:
user =forms.CharField(label='用户名', min_length=6)
pwd = forms.CharField(label='密码', min_length=3)
radioSelect :
gender = forms.fields.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性别",
initial=3,
widget=forms.widgets.RadioSelect()
)
多选SelectMultiple:
hobby = forms.fields.MultipleChoiceField
(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=[1, 3],
widget=forms.widgets.SelectMultiple())

单选checkbox
keep = forms.fields.ChoiceField(
label="是否记住密码",
initial="checked",
widget=forms.widgets.CheckboxInput()

多选checkbox
hobby = forms.fields.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=[1, 3],
widget=forms.widgets.CheckboxSelectMultiple()
)

7FF09E
如果前端is_valid校验不通过,会生成错误form_obj.errors


form表单校验的4种方法
1.字段默认的校验
2.在validators中加正则
3.在validators中加校验的函数名
4.钩子函数

重写错误信息:
username = forms.CharField(
label='用户名',
min_length=6,
error_messages={
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短8位"
})



form小结;
form能做什么
form的定义和使用流程
有哪些字段
choices的取值3种取值方式
字段有哪些常用参数
参数
label 中文的提示
initial 初始值
min_length 最小长度
max_length 最大长度
required 是否是必填的
disabled 是否不可修改
error_messages = {
'min_length' : '太短了',
'max_length' : '够长了'
'required': '不能为空'
}
validators = [ 校验器1,校验器2 ]

form在视图中的使用
form在模板中的渲染
form校验的4种方法

猜你喜欢

转载自www.cnblogs.com/yunfengding/p/10505577.html
今日推荐