Day 12 forms渲染错误信息
一、forms渲染错误信息
1.创建py文件
2.撰写py文件
字段描述
-
initial="张三"
# 设置默认值 -
``error_messages={
“required”: “不能为空”,
“invalid”: “格式错误”,
“min_length”: “用户名最短8位” }
触发限制是返回的自定义的错误信息,默认English -
widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
-
# 把密码框设置为password类型,并指定class为c1和c2的样式类 # 当出现出错时,其他类型的input框默认是保留你写的内容,只有密码框不会保存 # 想要密码框错误时也保留内容,就设置render_value=True
from django import forms
from django.forms import widgets
class CheckUser(forms.Form):
name = forms.CharField(label='名字', max_length=10,
min_length=3, required=True,
widget=widgets.TextInput(attrs={'class': 'form-control'}),
error_messages={'min_length': '用户名太少了'})
password = forms.CharField(label='密码', max_length=18,
min_length=6, required=True,
widget=widgets.TextInput(attrs={'class': 'form-control'}),
error_messages={'min_length': '密码强度过低'})
phone = forms.CharField(label='手机', max_length=11,
min_length=11, required=True,
widget=widgets.TextInput(attrs={'class': 'form-control'}),
error_messages={'max_length': '手机格式不对', 'min_length': '手机格式不对'})
introduction = forms.CharField(label='简介', max_length=254,
required=False, error_messages={'max_length': '简介过长'},
widget=widgets.Textarea(attrs={'class': 'form-control'})
)
3.在视图函数中应用
from app01 import myform
def index(request):
forms = myform.CheckUser()
if request.method == 'POST':
data = request.POST
forms = myform.CheckUser(data)
if forms.is_valid(): # 校验通过
print('校验通过准备存入数据库!')
return redirect('http://www.baidu.com')
return render(request, 'index.html', {'forms': forms})
4.模板文件
<div class="col-md-4 col-md-offset-4">
<form action="" method="post">
{% for form in forms %}
<div class="form-group">
<label for="">{{ form.label }}</label>
{{ form }}
<span style="font:10px rgba(194,0,0,0.79);list-style-type: none">{{ form.errors }}</span></div>
{% endfor %}
<input type="submit" class="btn btn-info text-center" value="注册">
</form>
</div>
修改错误信息
1.局部重写错误信息,哪个字段需要重写错误信息就在哪个字段设置
class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三",
error_messages={
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短8位"
}
)
pwd = forms.CharField(min_length=6, label="密码")
2.设置全局错误信息(把默认的错误信息由英文改成中文)
在settings.py里面设置
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 把语言改成中文(汉字)
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 时区改成亚洲上海
二、局部钩子和全局钩子
局部钩子的使用
1 在自定义的Form类中写 clean_字段名
2 取出字段的真正值,name=self.cleaned_data.get(‘name’)
3 判断自己的规则,如果判断失败,抛出ValidationError
4 如果通过,return name
局部钩子
写了两个只有两个了
def clean_name(self):
name = self.cleaned_data.get('name')
if name.startswith('sb'):
raise ValidationError('不能以sb开头')
else:
# 校验通过
return name
def clean_phone(self):
phone = self.cleaned_data.get('phone')
if re.match('\d+', phone):
return phone
else:
raise ValidationError('手机格式不对!')
全局钩子
def clean(self):
password = self.cleaned_data.get('password')
repassword = self.cleaned_data.get('repassword')
if password == repassword:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致')
执行顺序,先走局部钩子再进行全局钩子
三、cookie session token
1 https://www.cnblogs.com/liuqingzheng/articles/8990027.htmlp
2 cookie:客户端浏览器上的键值对
3 session:存在服务端的键值对
4 token:加密的键值对,如果放在客户端浏览器上,它就叫cookie, 服务端签发的加密字符串
head.{name:lqz,age:18}.eseetsweasdca
base64加码:
asdfasfd.asdfasdf.asdfasdfaeraew
后端校验:
用这个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