目录
4.在 settings.py中,设置session的相关设置
day06回顾
1.自定义查询对象
1.声明类 继承自 models.Manager
定义自定义函数
2.为实体类覆盖 objects
class Entry(models.Model):
objects = EntryManager()
2.HttpRequest
1.判断请求方式
request.method
2.获取请求提交的数据
1.get
request.GET['name']
2.post
request.POST['name']
3.获取请求消息头
request.META
request.META.HTTP_REFERER
4.提交post请求
Django对post请求需要进行一个 csrf 验证
解决方案:
1.增加 {% csrf_token %} 标签
2.删除 csrf 相关的中间件
3.将 @csrf_protect 添加到视图处理函数上
3.使用 forms 模块
1.使用 forms 模块
1.创建 forms.py
2.导入 forms 模块
from django import forms
3.创建 class,一个class对应着一个表单
class ClassName(forms.Form):
属性 :每一个属性会生成一个表单控件
forms.CharField()
forms.EmailField()
forms.IntegerField()
... ...
2.在模板中 解析 form 对象
0.注意
1.创建表单 - <form></form>
2.自定义按钮
1.手动解析
form = XXXForm()
return render(request,'xxx.html',locals())
xxx.html :
{% for field in form %}
{{field}} : 表示的是一个控件
{{field.label}} : 表示的是label参数值
{% endfor %}
2.自动解析
{{form.as_p}}
{{form.as_ul}}
{{form.as_table}}
3.视图中通过 forms.Form 接收表单数据
1.通过 forms.Form的构造器接收数据
form = XXXForm(request.POST)
2.需要让 form 通过验证后 ,再取值
form.is_valid()
True:通过所有验证
False:未通过验证
3.获取表单数据
form.cleaned_data
1.forms模块
- forms模块的高级处理
将Models 和 Forms 结合到一起使用- 在 forms.py 中创建class,继承自 forms.ModelForm
- 创建内部类 Meta,去关联 Model
- model:指定要关联的实体类
- fields:指定从Model中取哪些字段生成控件
- 取值 '__all__',表示全部属性都要生成控件
- 取值 列表,声明允许生成控件的属性名
- labels:指定每个属性所关联的label,取值为字典
labels = {
‘属性名’:'label文本',
'属性名':'label文本',
}
解析:
index下的model.py创建类
forms.py关联,创建控件from django.db import models # Create your models here. class User(models.Model): uphone=models.CharField(max_length=30) upwd=models.CharField(max_length=30) uname=models.CharField(max_length=50) uemail = models.EmailField()
交给视图函数views.pyfrom django import forms from .models import * class RegisterForm(forms.ModelForm): #通过内部类Meta表示关联的信息 class Meta: #1.指定关联的Model model = User #2.指定要生成控件的字段们 fields = "__all__" #3.指定每个控件对应的label labels = { 'uphone':'电话号码', 'upwd':'登录密码', 'uname':'用户名称', 'uemail':'电子邮件', } class LoginForm(forms.ModelForm): class Meta: model = User fields = ['uphone','upwd'] labels = { 'uphone':'注册电话', 'upwd':'登录密码', } #指定小部件 widgets = { 'upwd':forms.PasswordInput(attrs={ 'placeholder':'请输入您的密码' }) }
from django.http import HttpResponse from django.shortcuts import render from .forms import * def register_views(request): if request.method == 'GET': form = RegisterForm() return render(request,'05-register.html',locals()) else: form = RegisterForm(request.POST) if form.is_valid(): user = User(**form.cleaned_data) # 数据库配置成功并且实体类映射成表之后,该操作可以实现 user.save() return HttpResponse('OK') def login_views(request): if request.method == 'GET': form = LoginForm() #声明一个带有小部件的form - WidgetLoginForm # form = WidgetLoginForm() return render(request,'06-login.html',locals())
- 内置小部件
- 什么是小部件
小部件(widget),表示的是生成到页面上的控件的类型以及其他的html属性 - 常用小部件类型
- TextInput:type='text'
- PasswordInput:type='password'
- NumberInput:type='number'
- EmailInput:type='email'
- URLInput:type='url'
- HiddenInput:type='hidden'
- CheckboxInput:type='checkbox'
- Textarea:<textarea></textarea>
- Select:<select></select>
- 小部件的使用
- 继承自 forms.Form
- 基本版
只指定控件的类型
class RemarkForm(forms.Form):
属性 = forms.CharField(
label='文本',
widget=forms.小部件类型
)class WidgetLoginForm(forms.Form): uphone = forms.CharField(label='电话号码') #为pwd指定小部件,显示为 密码框 upwd = forms.CharField(label='登录密码',widget=forms.PasswordInput)
- 高级版
指定控件类型的基础上还允许设置html的一些相关属性
属性 = forms.CharField(
label=‘文本’,
widget=forms.小部件类型(
attrs = {
'html属性名':'属性值',
'html属性名':'属性值',
}
)
)class WidgetLoginForm(forms.Form): uphone = forms.CharField(label='电话号码') upwd = forms.CharField( label='登录密码', widget=forms.PasswordInput( attrs = { 'placeholder':'请输入密码', 'class':'form-control', } ) )
- 基本版
- 继承自 forms.ModelForm
class XXXForm(forms.ModelForm):
class Meta:
model = User
fields = "__all__"
labels = {
'属性1':'Label1',
}
widgets = {
'属性1':forms.小部件类型(attrs={}),
}class LoginForm(forms.ModelForm): class Meta: model = User fields = ['uphone','upwd'] labels = { 'uphone':'注册电话', 'upwd':'登录密码', } #指定小部件 widgets = { 'upwd':forms.PasswordInput(attrs={ 'placeholder':'请输入您的密码' }) }
- 继承自 forms.Form
- 什么是小部件
2.cookies 在 Django 中的实现
- django 中使用 cookies
- 设置cookies的值
语法:
相应对象.set_cookie(key,value,expires)
key:cookies的名字
value:cookie的值
expires:保持时间,以s为单位
ex:
响应对象.set_cookie('uname','tom',60*60*24*365)
响应对象:- HttpResponse
resp = HttpResponse('给客户端的一句话')
resp.set_cookie('key','value',expires)
return resp - render()
resp = render(request,'xxx.html',locals())
resp.set_cookie('key','value',expires)
return resp - HttpResponseRedirect / redirect
resp = redirect('/地址/')
resp.set_cookie('key','value',expires)
return resp
- HttpResponse
- 获取cookies的值
通过 request.COOKIES 获取当前站点下所有的cookies的信息
- 设置cookies的值
3.session 在 Django 中的实现
- 设置session 的值
request.session['key'] = value - 获取 session 的值
value = request.session[key]
value = request.session.get('key') - 删除 session 的值
del request.session['key']
4.在 settings.py中,设置session的相关设置
- SESSION_COOKIE_AGE
作用:设置 sessionID 在 cookie 中的保存时间
ex:
SESSION_COOKIE_AGE = 60*60*24 - SESSION_EXPIRE_AT_BROWSER_CLOSE
作用:设置关闭浏览器时则清空服务器上对应的session空间
ex:
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
练习:用session和cookie判断是否登陆成功,
简单代码:
views.py中的部分代码
def login_views(request):
# 判断 get 请求还是 post 请求
if request.method == 'GET':
#get请求 - 判断session,判断cookie,登录页
#先判断session中是否有登录信息
if 'uid' in request.session and 'uphone' in request.session:
#有登录信息保存在 session
return HttpResponse('您已经登录成功了')
else:
#没有登录信息保存在 session,继续判断cookies中是否有登录信息
if 'uid' in request.COOKIES and 'uphone' in request.COOKIES:
#cookies中有登录信息 - 曾经记住过密码
#将cookies中的信息取出来保存进session,再返回到首页
uid = request.COOKIES['uid']
uphone = request.COOKIES['uphone']
request.session['uid']=uid
request.session['uphone']=uphone
return HttpResponse('您已经登录成功')
else:
#cookies中没有登录信息 - 去往登录页
form = LoginForm() #这是forms.py中的类名
return render(request,'login.html',locals())
else:
#post请求 - 实现登录操作
#获取手机号和密码
uphone = request.POST['uphone']
upwd = request.POST['upwd']
#判断手机号和密码是否存在(登录是否成功)
users=User.objects.filter(uphone=uphone,upwd=upwd)
if users:
#登录成功:先存进session
request.session['uid']=users[0].id
request.session['uphone']=uphone
#声明响应对象:响应一句话"登录成功"
resp = HttpResponse("登录成功")
#判断是否要存进cookies
if 'isSaved' in request.POST:
expire = 60*60*24*90
resp.set_cookie('uid',users[0].id,expire)
resp.set_cookie('uphone',uphone,expire)
return resp
else:
#登录失败
form = LoginForm()
return render(request,'login.html',locals())
今日示例:点击
b5nn