注册功能1.渲染前端标签获取用户输入      >>>            渲染标签2.获取用户输入传递到后端校验    >>>            校验数据3.校验未通过展示错误信息        >>>            展示信息校验数据(前后端都可以校验)校验前端后端都可以做,但是前端可以不做,后端必须得做!!!django form组件1.渲染标签2.校验数据3.展示信息校验数据第一步需要在views中写一个form类from django import formsclass MyForm(forms.Form):name = forms.CharField(max_length=6)password = forms.CharField(max_length=8,min_length=3)email = forms.EmailField(required=True)第二步实例化form对象form_obj = MyForm({'name':'jason'})第三步查看数据校验是否合法form_obj.is_valid()  # 只有当所有的字段都校验通过才会返回True
            第四步查看校验错误的信息form_obj.errors  # 这个里面放的是所有校验未通过的字段及错误提示"""{'name': ['Ensure this value has at most 6 characters (it has 7).'], 'password': ['Ensure this value has at least 3 characters (it has 2).'], 'email': ['Enter a valid email address.']}"""第五步查看校验通过的数据form_obj.cleaned_data  # 符合校验规则数据都会被放到该对象中
            ps:form组件校验数据的规则从上往下依次取值校验校验通过的放到cleaned_data校验失败的放到errors注意:form中所有的字段默认都是必须传值的(required=True)校验数据的时候可以都传(多传的数据不会做任何的校验>>>不会影响form校验规则)渲染标签form组件只帮你渲染获取用户输入的标签,不会帮你渲染提交按钮,需要手动添加<h1>第一种渲染方式(可扩展性较差)</h1>{{ form_obj.as_p }}{{ form_obj.as_ul }}<h1>第二种渲染方式</h1><form action=""><p>{{ form_obj.name.label }}{{ form_obj.name }}</p><p>{{ form_obj.password.label }}{{ form_obj.password }}</p><p>{{ form_obj.email.label }}{{ form_obj.email }}</p><input type="submit"></form><h1>第三种渲染标签的方式</h1><form action="">{% for foo in form_obj %}<p>{{ foo.label }}{{ foo }}</p>{% endfor %}</form>前端取消校验 参数 novalidate<form action="" method="post" novalidate></form>form组件提交数据如果数据不合法,页面上会保留之前用户输入的信息在使用form组件对模型表进行数据校验的时候,只需要保证字段一致那么在创建的对象的时候你就直接**form_obj.cleaned_data<form action="" method="post" novalidate>{% for foo in form_obj %}<p>{{ foo.label }}{{ foo }}<span>{{ foo.errors.0 }}</span></p>{% endfor %}<input type="submit"></form># 钩子函数# 局部钩子函数  (单个字段的校验利用局部钩子函数)def clean_name(self):name = self.cleaned_data.get('name')if '666' in name:self.add_error('name','光喊666是不行的,要有真实力!')return name  # return还是要加上的,兼容性考虑# 全局钩子函数  (多个字段的校验利用全局钩子函数)def clean(self):password = self.cleaned_data.get('password')confirm_password = self.cleaned_data.get('confirm_password')if not password == confirm_password:self.add_error('confirm_password',"两次密码不一致,你这个dsb!")return self.cleaned_data# 设置标签样式from django import formsfrom django.forms import widgetspassword = forms.CharField(max_length=8,min_length=3,error_messages={'max_length': '密码最长8位','required': '密码不能为空','min_length':'密码最少3位'},widget=widgets.PasswordInput(attrs={'class':'c1 form-control'}))hobby = forms.ChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=3,widget=forms.widgets.Select())hobby1 = forms.MultipleChoiceField(choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),label="爱好",initial=[1, 3],widget=forms.widgets.SelectMultiple())keep = forms.ChoiceField(label="是否记住密码",initial="checked",widget=forms.widgets.CheckboxInput())

forms组件使用完整示例:

views中定义form类:

class RegForm(forms.Form):name = forms.CharField(max_length=10,min_length=3,label='用户名', error_messages={'required':'用户名不能为空!','invalid':'格式错误!','max_length':'注册用户名长度不能超过10位!','min_length':'注册用户名长度不能低于3位',},widget=forms.widgets.Input(attrs={'class':'form-control','style':'width:250px'},))password = forms.CharField(max_length=16,min_length=3,label='密码', error_messages={'required':'注册密码不能为空!','invalid':'格式错误!','max_length':'密码超出最大长度16位!','min_length':'密码长度不能低于3位!'},widget=forms.widgets.PasswordInput(attrs={'class':'form-control','style':'width:250px'}))re_password = forms.CharField(max_length=16, min_length=3,label='再次输入密码', error_messages={'required': '注册密码不能为空!','invalid': '格式错误!','max_length': '密码超出最大长度16位!','min_length': '密码长度不能低于3位!'},widget=forms.widgets.PasswordInput(attrs={'class': 'form-control', 'style': 'width:250px'}))cellphone = forms.CharField(max_length=14,min_length=10,label='请输入手机号',error_messages={'required': '注册手机号不能为空!','invalid': '格式错误!','max_length': '手机号长度不合法!','min_length': '手机号长度不合法!'},widget=forms.widgets.Input(attrs={'class':'form-control','style':'width:250px','id':'cellphone'}))def clean_name(self):name = self.cleaned_data.get("name")if not name.isalpha():self.add_error('name','用户名必须由字母数字组成!')elif name[0].isdigit():self.add_error('name','用户名不能以数字开头!')elif models.User.objects.filter(name=name):self.add_error('name','该用户名已存在!')return namedef clean(self):password = self.cleaned_data.get("password")re_password = self.cleaned_data.get('re_password')if password != re_password:self.add_error('re_password','两次密码不一致!')elif password == '123':self.add_error('password','当前密码过于简单!')return self.cleaned_datadef clean_cellphone(self):cellphone = self.cleaned_data.get("cellphone")regExp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$"if not re.findall(regExp,cellphone):self.add_error('cellphone','请输入正确的手机号!')elif models.User.objects.filter(cellphone = cellphone):self.add_error('cellphone','该手机号已注册!请换一个再试!')return cellphone

前端渲染代码:

由于引入了许多第三方样式,没有导入JS,CSS样式等部分,截取了body部分作为示例

<body>
<div class="container" id="particles-js"><div id="main-div"><h3 style="text-align: center">欢迎注册图书管理系统</h3><form action="" method="post" style="width: 250px;margin: 20px auto"  autocomplete="off"  novalidate>{% for form_datum in form_data %}               <p>{{ form_datum.label }}{{ form_datum }}<span style="color: red">{{ form_datum.errors.0 }}</span></p>{% endfor %}<span>请输入验证码:</span><p ><input type="text" class="form-control" name="yzm" style="width: 120px;display:inline-block;"><input href="#" class="btn btn-info feachBtn"  style="width: 130px;float: right;" value="获取手机验证码"></p><span style="color: red">{{ yzm }}</span><p style="padding: 10px 0;"><input type="submit" class="btn btn-info btn-block" value="注册"></p></form></div>
</div>
</body>

views视图函数处理部分:

def register(request):form_data = RegForm()if request.method == "POST":form_data = RegForm(request.POST)if form_data.is_valid():            #检查是否通过校验,没有则返回前端error信息,通过则注册dic = dict(form_data.cleaned_data)dic["user_type"] = 'user'dic.pop('re_password')# dic['cellphone'] = request.session.get("cellphone")models.User.objects.create(**dic)return redirect('/admins/show-book/')return render(request, "reg.html",locals())

转载于:https://www.cnblogs.com/dongxixi/p/11042917.html

Django之forms组件使用相关推荐

  1. Django之forms组件

    一.校验数据功能 我们在写注册页面时,之前只是提交了数据,然后就保存了数据,后端根本就没有对数据进行校验,比如价格写的不是纯数字也让保存,这肯定是不行的,在前端是可以校验的,但我们不能只依靠前端验证, ...

  2. markdownpad2 html渲染组件出错_Day68 Django forms组件

    目录 forms组件 forms组件类书写 forms组件如何校验数据 forms组件如何渲染标签 forms组件展示错误信息 forms组件钩子函数(HOOK) forms组件常见参数 forms组 ...

  3. django.forms生成HTML,第21天,Django之Form组件

    ModelForm 一.Form组件初识 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 mo ...

  4. Django:(5)分页器 forms组件

    Django组件:分页器 目录结构: urls.py from django.contrib import admin from django.urls import pathfrom app01 i ...

  5. django框架——sweetalert前端插件、序列化组件、批量数据操作、分页器、Forms组件(上)

    系列文章目录 第一章 django安装与介绍 第二章 django基础使用 第三章 路由层 第四章 虚拟环境.django版本区别.视图层 第五章 模板层 第六章 模型层(上) 第七章 模型层(下) ...

  6. Django forms组件

    校验字段 模板文件 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  7. Django之Form组件

    一.Form组件介绍 1.Form组件可以做的几件事情 1.用户请求数据验证 2.自动生成错误信息 3.打包用户提交的正确信息 4.如果其中有一个错误了,其他的正确这,保留上次输入的内容 5.自动创建 ...

  8. Auth模块、Forms组件

    Auth模块 auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这 ...

  9. 转载:Django之Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 + View C ...

  10. Django框架-Form组件

    一.DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校 ...

最新文章

  1. ISP 【一】————boost标准库使用——批量读取保存文件 /boost第三方库的使用及其cmake添加,图像gramma
  2. 怎么才能优雅地向导师表达「这周科研没什么进展」?
  3. eclipse提交项目到github
  4. ConcurrentHashMap源码分析(转载)
  5. linux主机数据拷贝,linux 服务器之间拷贝文件
  6. Smark.Data 1.5更新详解
  7. 安笙机器人_张翰新戏搭档徐璐!包贝尔要和辛芷蕾演奇幻电影?
  8. 还在搭建传统IT架构的你,正在慢慢被行业淘汰
  9. AD选择板边覆铜教程
  10. SD卡格式化咋办?数据恢复看这里!
  11. COOC9.94一款用于文献计量和知识图谱绘制的软件
  12. 雨课堂和微助教比较分析
  13. 猫哥教你写爬虫 008--input()函数
  14. 笔记本电脑外接显示器以后检测不到笔记本电脑原来的显示器,把hdmi拔出来了也没用
  15. 对java栈的初步认识
  16. UE4开发PSVR游戏,使用RazorGPU进行调试的方法
  17. 04_Linux软件包管理
  18. linux可以运行Windows程序吗,如何Linux系统上运行Windows应用程序(7)
  19. 通过自定义注解和java反射实现Spring-DI依赖注入
  20. 手把手教你python实现量价形态选股知乎_怎样通过量价形态选股?量价选股技巧...

热门文章

  1. php装逼的面试问题,面试读心术,教你如何优雅的在面试官前装逼
  2. mysql硬盘复制无法启动_磁盘的移动导致MySQL数据启动失败
  3. 自定义ArrayStack
  4. 前端全栈必会node框架koa。。。
  5. Linux中断 - GIC代码分析
  6. Python标准库:内置函数ascii(object)
  7. elasticsearch 问题.
  8. EF6 秘籍 2th:Entity Framework 入门(二)EF简介
  9. 合理使用Blob/Clob
  10. vue中点击加号_零基础入门vue开发