Django第十四日
一 froms渲染错误信息
视图函数
from app01 import MyForm
def register(request):
if request.method=='GET':
form=myforms.MyForm()
return render(request, 'register.html',{'form':form})
else:
form=myforms.MyForm(request.POST)
if form.is_valid():
return redirect('http://www.baidu.com')
else:
return render(request, 'register.html',{'form':form})
模板
<form action="" method="post" novalidate>
{% for foo in form %}
<div class="form-group">
<label for="">{{ foo.label }}</label>
{{ foo }}
<span class="text-danger pull-right">{{ foo.errors }}</span>
</div>
{% endfor %}
<div class="text-center">
<input type="submit" value="提交" class="btn btn-danger">
</div>
</form>
二 forms组件参数配置
定制模板中的显示样式,及配置类 语法
记得先导入哦from django.form import widget
校验方法的参数加上widget=widgets.PasswordInput(attrs={'class': 'form-control'})
错误信息中文显示语法
校验方法的参数加上error_messages={'min_length': '太短了小伙子'}
综合案例:
class MyForm(forms.Form):
# 校验这个字段,最大长度是32,最小长度是3
name = forms.CharField(required=False, max_length=32, min_length=3, label='用户名',
widget=widgets.TextInput(attrs={'class': 'form-control'}),
error_messages={'min_length': '太短了小伙子'})
password = forms.CharField(required=False, max_length=32, min_length=3, label='密码',
widget=widgets.PasswordInput(attrs={'class': 'form-control'}),
error_messages={'min_length': '太短了小伙子'})
re_password = forms.CharField(required=False, max_length=32, min_length=3, label='确认密码',
widget=widgets.PasswordInput(attrs={'class': 'form-control'}),
error_messages={'min_length': '太短了小伙子'})
email = forms.EmailField(label='邮箱', error_messages={'required': '小惠子,这个必填'},
widget=widgets.TextInput(attrs={'class': 'form-control'}))
age = forms.IntegerField(max_value=200, min_value=0, label='年龄',
widget=widgets.TextInput(attrs={'class': 'form-control'}))
text = forms.CharField(label='个人简介', widget=widgets.Textarea(attrs={'class': 'form-control'}))
date = forms.CharField(label='出生日期', widget=widgets.DateInput(attrs={'class': 'form-control'}))
三 局部钩子和全局钩子
局部钩子的使用
- 在自定义的Form类中写
clean_字段名
- 取出字段的真正值,
name=self.cleaned_data.get('name')
- 判断自己的规则,如果判断失败,抛出
ValidationError
(导入:from django.form import ValidationError
) - 如果通过,
return name
- 钩子底层的执行顺序,字段一的基本校验–>字段一局部钩子–>字段二的基本校验->…–>最后一个才是全局钩子
所以若想在局部钩子里对比校验两个字段,会有一个还未生成
局部钩子
def clean_name(self):
# name对应的值,如何取到?
name = self.cleaned_data.get('name')
if name.startswith('sb'):
# 不让校验通过
raise ValidationError('不能以sb开头')
else:
# 校验通过,返回name
return name
全局钩子
def clean(self):
# name=self.cleaned_data.get('name')
# print(name)
password = self.cleaned_data.get('password')
re_password = self.cleaned_data.get('re_password')
if password == re_password:
return self.cleaned_data
# return {'lqz':"nb"}
else:
raise ValidationError('两次密码不一致')
四 cookie session token
-
cookie
:客户端浏览器上的键值对
3session
:存在服务端的键值对
4token
:加密的键值对,如果放在客户端浏览器上,它就叫cookie, 服务端签发的加密字符串
后端校验:
用这个token去查我的账户余额,向银行发请求,银行校验通过,是银行给你的,—> 返回你的余额
head.{name:lqz,age:18}.eseetsweasdca
head.{name:egon,age:18}.eseetsweasdca
五 django中cookie的使用
# 增
def cookie_test(request):
# 浏览器向我这个地址发一个请求,就在浏览器写入 name = lqz
obj=HttpResponse('ok')
obj.set_cookie('name','egon') # 写入到浏览器了,在http响应头里:cookie: name=lqz
obj.set_cookie('age','19') # 写入到浏览器了,在http响应头里:cookie: name=lqz
return obj
# 查
def get_cookie(request):
print(request.COOKIES)
print(request.COOKIES.get('name'))
return HttpResponse('我拿了你传过来的cookie')
# 删
def delete_cookie(request):
obj=HttpResponse('我删掉了你 name 这个cookie ')
obj.delete_cookie('name')
return obj