您的位置:首页 > 编程语言 > Go语言

Django之Form验证进阶常用字段注释示例(验证篇三)

2019-01-26 06:21 351 查看
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/Burgess_zheng/article/details/86653907

上一篇:Django之Form验证初阶实战示例(验证篇二) 点击跳转
目录篇:Django之Form及ModelForm目录篇 点击跳转
下一篇:Django之Form验证之Ajax两种返回错误信息示例(验证篇四)点击跳转

Form常用字段注释

1.自定义form字段验证类
2.实例化form对象(初始化信息)并把该form对象对象返回前端(前端可根据该对象调用字段相关信息)
3.前端提交的数据进行验证提取正确or错误信息及响应错误信息(把form对象返回,前端可以调用验证错误信息)

路径:project_burgess/burgess_form/views.py

[code]__author__ = "Burgess Zheng"
from django.shortcuts import render
from django.core.validators import RegexValidator
from django import forms as DForms
from django.forms import fields
from django.forms import widgets

class DetailForm(DForms.Form):
user1 = fields.CharField()
# 默认插件是input标签type='text'

user2 = fields.CharField(
widget=widgets.TextInput(
# widget为插件
attrs={'class': 'c1', 'placeholder': '用户名'}
# 增加该标签属性
)
)
# fields.字段类型()指定字段类型、生成对应标签
# widget: #插件指定标签类型和可增加标签内部属性

user3 = fields.IntegerField()

user4 = fields.ChoiceField(
choices=[(1, 'SH'), (2, 'BJ'), ]
# 下拉选择框:列表里面每个元组为一种选择元组下标0:标签value 下标1:位选项
)

# 本质上ChoiceField获取的是字符串所以可用以下两种格式格式:
user5 = fields.CharField(
widget=widgets.Select(choices=[(1, 'SH'), (2, 'BJ'), ])
)
user6 = fields.IntegerField(
widget=widgets.Select(choices=[(1, 'SH'), (2, 'BJ'), ])
)
# fields.ChoiceField是上面两种格式缩写,本质上就是字段生成后指定插件为Select
# 字段IntegerField 我们看见接收的是数字类型

# -------------常用字段--------------------
f1 = fields.CharField(
max_length=6,  # 长度最大6
min_length=1,  # 长度最少1
strip=True,  # 移除输入的空白
required=True,  # 不允许空内容,默认是True必须填写内容
initial="小虎",  # 标签的name的初始值
validators=[RegexValidator(r'^[0-9]+$', '请输入数字', code='f1'),
RegexValidator(r'^159[0-9]+$', '数字必须以159开头', code='f2')],
# 自定义正则表达式,验证必须也要满足上面2个自定义判断
# 元组的下标1是报错信息,如果error_messages参数存在就会被修改
error_messages={'required': '不能为空',
'invalid': 'geshicuowu',
'max_length': '长度不能超过6',
'f1': 'qingshurushuzi',
'f2': 'shuzibixuyi159kaitou'},
# 报错修改(可修改中文)优先级最高:可覆盖内部的报错或者自己定义的报错

# 上面4个参数最重要
disabled=False,  # 该标签可编辑
show_hidden_initial=True,  # 自动生成一个隐藏的标签
label='用户名',  # 内容,前端可调用
label_suffix="-->"  # label内容的后缀,默认是:现在改成-->
)

f2 = fields.RegexField(r'^159[0-9]+$')  # 自定义验证字段(手机验证)

f3 = fields.FileField()  # 上传标签

f4 = fields.ChoiceField(  # 单选select框
choices=[(1, '赵四'), (2, '刘能'), (3, '六六脑袋'), ],
initial=2,  # 默认值是刘能
)
f5 = fields.TypedChoiceField(  # 单选select框
coerce=lambda x: int(x),  # 数据转换
choices=[(1, '赵四'), (2, '刘能'), (3, '六六脑袋'), ],
initial=2,  # 默认选中刘能
)

f6 = fields.MultipleChoiceField(  # 多选select框 同理也有TypedM..C..Field
initial=[1, 2],  # 默认选中赵四和刘能
choices=[(1, '赵四'), (2, '刘能'), (3, '六六脑袋'), ],
)

f7 = fields.SplitDateTimeField()
# 同时生产多个框,应用场景如:用户输入电话(国家代码,省份,电话号码)

f8 = fields.FilePathField(
path='app01',
# 显示该app01目录下所有的文件,选中哪个文件提交,后台获取该文件的路径
allow_files=True,  # 该目录下的文件显示
allow_folders=True,  # 该目录下的目录也显示
recursive=True,  # 递归显示,目录下所有目录文件全部显示
)

def fm1(request):
if request.method == 'GET':
obj = DetailForm()
return render(request, 'fm1.html', {'obj': obj})
elif request.method == "POST":
obj = DetailForm(request.POST, request.FILES)
# request.FILES接收前端上传文件
# 验证
# obj.is_valid()#触发校验  会出现2个结果,True或False
if obj.is_valid():
# 如果结果是True我们就通过obj.cleaned_data获取正确数据
# 如果结果是False我们就通过obj.errors获取正确数据
value_dict = obj.cleaned_data
value_dict = obj.clean()
print(value_dict)
# models.xx.object.create(**value_dict) 验证成功存放到数据库

# 如果是ajax 这里进行判断用户密码邮箱是否已经存在,存在就直接返回一个字典获取
#rep = {'status': True, 'error': None, 'data': None}
#has_exists_email = models.UserInfo.objects.filter(email=email).count()
#if has_exists_email:
#   rep.error = "此邮箱已经被注册"
#   return HttpResponse(json.dumps(rep.__dict__))
# 如果不存在允许注册

else:
print('--------验证失败,获取错误信息(标签对象)--------')
error_obj = obj.errors  # 获取验证失败的错误(标签对象)
print(error_obj)
print('\t--------查看类型:对象继承字典--------')
print(type(error_obj))  # 是一个对象继承了字典
print('\t--------获取指定的标签错误信息--------')
print(error_obj['email'])  # 获取到了email的错误信息
print(error_obj['user'])  # 获取到了user的错误信息
print('\t--------查看类型:对象继承列表--------')
print(type(error_obj['email']))  # 还是对象继承了列表(错误可能有同时有几个)
print('\t--------获取指定标签指定错误信息--------')
print(error_obj['email'][0])  # 不管错误有几个我只取第一个错误
print(error_obj['user'][0])  # 不管错误有几个我只取第一个错误
print('\t--------查看类型:字符串--------')
print(type(error_obj['user'][0]))  # 字符串

print('--------验证失败,获取错误信息(字典格式)--------')
error_dict = obj.errors.as_json()  # 获取验证失败的错误(字典格式)
print(error_dict)
print('--------clean验证失败,获取错误信息(字典格式)--------')
#errors_self = obj.errors.get('__all__', None)
# 记住 def clean 验证数据的错误,__all__该key前端调用不了
# 如果errors不重新生成的话 前端调用:form.non_field_errors(不好看)
return render(request, 'fm1.html', {'obj': obj})

前端通过form对象调用字段相关信息

路径:project_burgess/templates/fm1.html

[code]<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/field.html" method="POST" enctype="multipart/form-data">
<div>
{{ obj.user1 }}
{{ obj.user2 }}
{{ obj.user3 }}
{{ obj.user4 }}
{{ obj.user5 }}
{{ obj.user6 }}
</div>

<div>
<label for ="{{ obj.f1.id_for_label }}">{{ obj.f1.label }}</label>
{#obj.f1.id_for_label:form生成的标签会自动生成标签ID的(获取该标签的ID)#}
{# obj.f1.label: form生成的标签内部如果有定义该label内容就调取该label内容#}
{{ obj.f1.label_tag }}
{#上面的简写#}
{{ obj.f1 }}
{# obj.f1: form生成的标签(调取该标签)#}
</div>

<div>
{{ obj.f2 }}
</div>

<div>
{{ obj.f3 }}
</div>

<div>
{{ obj.f4 }} - {{ obj.f5 }}- {{ obj.f6 }}
</div>

<div>
{{ obj.f7 }}
</div>

<div>
{{ obj.f8 }}
</div>

<input type="submit" />
</form>
</body>
</html>

浏览器访问显示

 

上一篇:Django之Form验证初阶实战示例(验证篇二) 点击跳转
目录篇:Django之Form及ModelForm目录篇 点击跳转
下一篇:Django之Form验证之Ajax两种返回错误信息示例(验证篇四)点击跳转​​​​​​​

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: