会话
从打开浏览器访问到关闭浏览器,这就是一次会话。
cookie 技术
cookie是保存在浏览器的,安全度比较低。
1 #设置cookie范式,在view中设置
2
3 defindex(request):4 #查看是否有num的这个cookie
5 num = request.COOKIES.get('num')6 ifnum:7 num = str(int(num)+1)8 else:9 num = '1'
10
11 response = render(request, 'teacher/index.html', context={12 'num':num13 })14 #设置cookie字段,max_age为浏览器保留的cookie时间(过期时间)。
15 response.set_cookie('num',num, max_age=10)16 return response
session 技术
在settings中注册,且是做了数据库迁移的。存储的数据默认存储在django_sessions表中
1 INSTALLED_APPS =[2 'teacher.apps.TeacherConfig',3 'django.contrib.admin',4 'django.contrib.auth',5 'django.contrib.contenttypes',6 'django.contrib.sessions', #最新的版本中是默认注册了的。但需要检查是否注册
7 'django.contrib.messages',8 'django.contrib.staticfiles',9 ]10
11 MIDDLEWARE =[12 'django.middleware.security.SecurityMiddleware',13 'django.contrib.sessions.middleware.SessionMiddleware', #默认是添加了的
14 'django.middleware.common.CommonMiddleware',15 'django.middleware.csrf.CsrfViewMiddleware',16 'django.contrib.auth.middleware.AuthenticationMiddleware',17 'django.contrib.messages.middleware.MessageMiddleware',18 'django.middleware.clickjacking.XFrameOptionsMiddleware',19 ]
设置session,view中配置
1 deflogin(request):2 if request.method == 'POST'
3 username = request.POST.get('username','')4 password = request.POST.get('password','')5 if username == 'aaa' and password == '123456':6 #如果登录成功,则把当前的用户名保存在session中
7 request.session['name'] =username8
9 #设置过期时间set_expiry
10 request.session.set_expiry(10)11 return redirect(reverse('teacher:index'))12
13 #如果在index的html中需要展示用户名的信息,则需要在index中获取session
14 #name = request.session.get('name'),然后在通过context传送到html中
15
16
17 #设置退出
18 deflogout(request):19 request.session.flush()20 return redirect(reverse('teacher:index'))21
22
23 #应用于html的和之前的方式是一样的。{{ }}or{% %}
session 依赖于cookie,cookie存在客户端,session存在服务端。
简单的Form表单
在app下面创建一个forms.py的文件
1 #导包
2 from django importforms3 classRegisterForm(forms.Form):4 username = forms.CharField(label='用户名', max_length=20)5 password = forms.CharField(label='密码',max_length=10,min_length=6,6 widget=forms.PasswordInput(attrs={'placeholder':'请输入长度为6-10位的密码'}),7 error_messages={'min_length':'密码长度小于6位','max_length':'密码长度大于10位'})8 password_repeat = forms.CharField(label='请再次输入密码',widget=forms.PasswordInput())9 email = forms.EmailField(required=False)10
11 defclean(self):12 cleaned_data = super().clean() #继承父类的clean方法
13
14 #从父类中检测处理过的数据
15 password = cleaned_data.get('password')16 password_repeat = cleaned_data.get('password_repeat')17
18 if password !=password_repeat:19 msg = '两次密码输入不一致'
20 self.add_error('password_repeat', msg) #把这个错误的信息加入到password_repeat这个字段中
21
22
23 解析:24 form表单中的不同的字段将会生成不同的input类型,CharField默认对应text25 字段名(变量)对应的html中input中的name26 PasswordInput:被渲染成passwo的input标签,里面的内容可以和input一样的内容定制27 label:对应的html中的label标签中的内容28 error_messages:表示出错后的提示29 required=False:可以不填写,表示可以是不填的选项
在view中应用:
1 #从APP中导入
2 from teacher.forms importRegisterForm3 defregister(request):4 #判断method
5 if request.method == 'GET':6 form = RegisterForm() #实例
7
8
9 if request.method == 'POST':10 form =RegisterForm(request.POST)11 ifform.is_valid():12 return HttpResponse('注册成功')13
14 return render(requerst, 'teacher/register.html', context={'form':form})15
16
17
18 解析:19 RegisterForm(request.POST),会根据传进来的request的值来创建一个form,一个绑定的form20 is_valid:自动会去根据配置好的去验证,调用此方法的时候,就会默认调用form里面的clean方法。21
在html中应用:
1
2 {% csrf_token %}3 {{ form.as_p }}4
5
form的标签和submit需要自己添加,其他的自己渲染。as_p代表用p标签包裹。
查看渲染后,代码是什么样式。
1 查看渲染后的代码2
3
用户名:
4
密码:
5
请再次输入密码:
6
Email:
7
8
输出渲染的结果:
密码的判断输出方式
模型Form表单
同样写在forms.py的文件内
1 #把需要的models模型导入
2 from teacher.models import Students,StudentsDetail
定义表单
1 #Students表单
2 classStudentForm(forms.ModelForm):3 classMeta:4 #不需要一个一个的编辑了,只需要用自带的方法即可,即排除
5 model =Students6
7 #表单内除了'is_deleted'这个字段外,其他的都需要,使用exclude方法
8 exclude = ['is_deleted']9
10 #StudentsDetail表单
11 classStudentDetailForm(forms.ModelForm):12 classMeta:13 model =StudentsDetail14
15 #表单内只需要这些字段,使用fields方法
16 fields = ['num', 'college']
在view中应用
1 #导入需要的form模型表单
2 from teacher.forms import StudentForm, StudentDetailForm
编辑学生信息页面
1 defnew_edit(request, pk):2 #获取当前编辑字段的信息
3 student = Students.objects.get(pk=pk)4
5 form = StudentForm(instance=student)6
7 try:8 #这里做出捕获异常,防止这个学生字段没有相对应的studentsdetail字段。
9 detail_form = StudentDetailForm(instance=student.studentsdetail)10
11 except:12 #如果报错,说明这个学生还没有学生详情
13
14 #生产一个空的详情
15 student_detail =StudentsDetail()16
17 #把两个表相关联起来,保存
18 student_detail.sudent =student19 student_detail.save()20
21 #生成新的form表单
22 detail_form = StudentDetailForm(instance=student_detail)23
24 *****此处的POST方法写在下面的POST请求方式操作中。25
26 return render(request, 'teacher/new_student_edit.html', context={27 'section': section,28 'student': student,29 'form': form,30 'detail_form': detail_form,31 })32
33
34 解析:35 instance:绑定一个信息,用于修改。36 如果不写这个,则生成一个空的Form,用于添加。37
html中整体应用
1
2 {% csrf_token %}3 {{ form.as_p }}4 {{ detail_form.as_p }}5
6 提交
7