博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django之form表单验证
阅读量:7153 次
发布时间:2019-06-29

本文共 5826 字,大约阅读时间需要 19 分钟。

form组件的校验功能

 views.py

from django.shortcuts import render, HttpResponse# Create your views here.from django import formsfrom django.forms import widgetsclass UserForm(forms.Form):    name = forms.CharField(min_length=4,label='用户名') # 必须用required    pwd = forms.CharField(min_length=4,label='密码')    r_pwd = forms.CharField(min_length=4,label='确认密码')    email = forms.EmailField(label='邮箱')    tel = forms.CharField(label='手机')def reg(request):    if request.method == 'POST':        # form = UserForm({'name': 'ed', 'email': '123@qq.com'})  # 加多少个键值都无所谓,只要能匹配全Form里的字段就会返回True        # print(form.is_valid())  # 返回布尔值                form = UserForm(request.POST)  # form表单的name属性值应该与forms组件字段名称一致        if form.is_valid():            print(form.changed_data)  # 存的是通过校验的字典        else:            print(form.cleaned_data)  # {正确的键值,"email":"123@11.com"}            print(form.errors)  # {"name":["insure this value has at least 4 characters]}            print(type(form.errors))  # ErrorDict            print(form.errors.get('name'))            print(type(form.errors.get('name')))  # ErrorList            print(form.errors.get('name')[0])  # This field is required.        '''        if 所有字段校验成功,则form.cleaned_data:{'name': 'edward', 'email': '123@qq.com'}        '''        return render(request, 'register.html', locals())    form = UserForm()   # get请求的form,渲染form组件用    return render(request, 'register.html', locals())

 

html

{% csrf_token %}

用户名:

密码:

确认密码:

邮箱:

手机号:

 

form组件渲染的三种方式

form组件渲染方式1

{% csrf_token %}

{

{ form.name.label }}:{
{ form.name }} {
{ form.name.errors.0 }}

{

{ form.pwd.label }}:{
{ form.pwd }} {
{ form.pwd.errors.0 }}

{

{ form.r_pwd.label }}:{
{ form.r_pwd }} {
{ form.r_pwd.errors.0 }}

{

{ form.email.label }}:{
{ form.email }} {
{ form.email.errors.0 }}

{

{ form.tel.label }}:{
{ form.tel }} {
{ form.tel.errors.0 }}


form组件渲染方式2

{% csrf_token %} {% for filed in form %}

{ filed.label }} {
{ filed }}

{% endfor %}

form组件渲染方式3 --- 不建议使用这种方式,因为它只能固定放那么几个标签,缺乏灵活性,以后改动麻烦

{% csrf_token %} {
{ form.as_p }}

 

显示错误信息和参数配置

class UserForm(forms.Form):    name = forms.CharField(min_length=4, label='用户名',                           error_messages={
"required": "该字段不能为空"}, widget=widgets.TextInput(attrs={
'class': 'form-control'}) ) # 必须用要提示错误信息的关键词 pwd = forms.CharField(min_length=4, label='密码', widget=widgets.PasswordInput(attrs={
'class': 'form-control'}), error_messages={ "required": "该字段不能为空" }) r_pwd = forms.CharField(min_length=4, label='确认密码', error_messages={
"required": "该字段不能为空"}, widget=widgets.PasswordInput(attrs={
'class': 'form-control'}), ) email = forms.EmailField(label='邮箱', error_messages={
"required": "该字段不能为空", 'invalid': "格式错误"}, widget=widgets.TextInput(attrs={
'class': 'form-control'}), ) tel = forms.CharField(label='手机', error_messages={
"required": "该字段不能为空", }, widget=widgets.TextInput(attrs={
'class': 'form-control'}), )

 

局部钩子

def clean_name(self):        val = self.cleaned_data.get('name')        ret = UserInfo.objects.filter(name=val)        if not ret:            return val        else:            raise ValidationError('该用户已注册!')                         def clean_tel(self):    val = self.cleaned_data.get('tel')    ret = UserInfo.objects.filter(tel=val)    if len(ret) == 11:        return val    else:        raise ValidationError('手机号格式错误')            # 源码def _clean_fields(self):    try:        if isinstance(field, FileField):            initial = self.get_initial_for_field(field, name)            value = field.clean(value, initial)        else:            value = field.clean(value)        self.cleaned_data[name] = value        if hasattr(self, 'clean_%s' % name):            value = getattr(self, 'clean_%s' % name)()            self.cleaned_data[name] = value     except ValidationError as e :        self.add_error(name, e)

 

全局钩子

为了解耦,新建一个myforms.py的文件,把有关forms的代码都放在这里面。

# 全局钩子# 走完所有的校验才走cleandef clean(self):    # 走完所有的校验才走clean    pwd = self.cleaned_data.get('pwd')    r_pwd = self.cleaned_data.get('r_pwd')        # 都满足不低于4个字符这个条件后才验证密码是否一致    if pwd and r_pwd:        if pwd == r_pwd:            return self.cleaned_data        else:            raise ValidationError('两次密码不一致')            else:                return self.cleaned_data        #源码def clean(self):    """    Hook for doing any extra form-wide cleaning after Field.clean() has been    called on every field. Any ValidationError raised by this method will    not be associated with a particular field; it will have a special-case    association with the field named '__all__'.    """    return self.cleaned_datadef _clean_form(self):    try:        cleaned_data = self.clean()    except ValidationError as e:        self.add_error(None, e)    else:        if cleaned_data is not None:            self.cleaned_data = cleaned_data                        # 全局钩子在前端没有显示,要在处理post请求的代码里给错误信息一个变量并传到前端errors = form.errors.get('__all__')# 当两次密码不一致时,在前端显示这个错误

{

{ form.r_pwd.label }}:{
{ form.r_pwd }} {
{ form.r_pwd.errors.0 }}
{
{ errors.0 }}

 

转载于:https://www.cnblogs.com/lshedward/p/10351900.html

你可能感兴趣的文章
16.构造函数和析构函数
查看>>
iOS - 选取相册中iCloud云上图片和视频的处理
查看>>
从零开始学架构二 架构设计流程
查看>>
日记:八月份的总结
查看>>
Liunx 特殊权限 suid sgid t
查看>>
Memcache的安装和使用【转】
查看>>
Android NDK OpenCV C++
查看>>
SQLAlchemy基础操作三
查看>>
(六)注解式控制器详解
查看>>
LeetCode OJ:Word Pattern(单词模式)
查看>>
[BJWC 2011]元素
查看>>
textbox获取焦点选中内容
查看>>
Map Wiki -- proposed by Shuo Ren
查看>>
字符函数 php
查看>>
js数组练习
查看>>
视图 Model转集合
查看>>
会计的思考(43):会计应在哪办公?
查看>>
c#自定义液晶数字控件
查看>>
Qt编写自定义控件11-设备防区按钮控件
查看>>
Qt编写安防视频监控系统(界面很漂亮)
查看>>