校验字段

模板文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="" method="post"><p>用户名: <input type="text" name="name"></p>
{#    <p>密码: <input type="text" name="pwd"></p>#}<p>确认密码: <input type="text" name="re_pwd"></p><p>邮箱: <input type="text" name="email"></p><input type="submit" value="提交"></form>
</body>
</html>

视图文件

from django import formsfrom django.forms import widgets

class MyForm(forms.Form):# 定义一个属性,可以用来校验字符串类型    # 限制最大长度是8,最小长度是3    name = forms.CharField(max_length=8, min_length=3, label='用户名',error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},) pwd = forms.CharField(max_length=8, min_length=3, required=True, label='密码',error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},) re_pwd = forms.CharField(max_length=8, min_length=3, required=True, label='确认密码',error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},)# 校验是否是邮箱格式 email = forms.EmailField(label='邮箱', error_messages={'required': '这个必须填', 'invalid': '不符合邮箱格式'})

数据从前端传过来,校验
要校验的字典,可以多参数,但是不能少
def index_form(request):# 生成对象时(实例化),需要传入要校验的数据(字典)if request.method=='GET':return render(request,'indxe.html')elif request.method=='POST':print(request.POST)myform=MyForm(request.POST)# is_valid如果是true表示校验成功,反之,校验失败if myform.is_valid():# 校验通过的数据print(myform.cleaned_data)return HttpResponse('校验成功')else:print(myform.cleaned_data)# 错误信息,它是一个字典print(myform.errors)print(myform.errors.as_data())print(type(myform.errors))from django.forms.utils import ErrorDictreturn HttpResponse('校验失败')

渲染模板

视图文件

from django.forms import widgets
from django.forms import widgets
from django.core.exceptions import ValidationErrorname = forms.CharField(widget=widgets.TextInput(attrs={'class': 'form-control'}))pwd = forms.CharField(widget=widgets.PasswordInput(attrs={'class': 'form-control'}))widgets 就是用来渲染的class MyForm(forms.Form):# 定义一个属性,可以用来校验字符串类型# 限制最大长度是8,最小长度是3name = forms.CharField(max_length=8, min_length=3, label='用户名',error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},widget=widgets.TextInput(attrs={'class': 'form-control'}))pwd = forms.CharField(max_length=8, min_length=3, required=True, label='密码',error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},widget=widgets.PasswordInput())re_pwd = forms.CharField(max_length=8, min_length=3, required=True, label='确认密码',error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},widget=widgets.PasswordInput())# 校验是否是邮箱格式email = forms.EmailField(label='邮箱', error_messages={'required': '这个必须填', 'invalid': '不符合邮箱格式'})渲染模板
def index_form(request):# 生成对象时(实例化),需要传入要校验的数据(字典)myform=MyForm()if request.method=='GET':return render(request,'indxe2.html',locals())

模板文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<hr>
<h1>第一种方式</h1>
<form action="" method="post" ><p>用户名: {{ myform.name }}</p><p>密码: {{ myform.pwd }}</p><p>邮箱: {{ myform.email }}</p><input type="submit" value="提交"></form>
<hr>
<h1>第二种方式(for循环form对象,建议用这种)</h1>
<form action="" method="post" >{% for foo in myform %}<p>{{ foo.label }}:{{ foo }}</p>{% endfor %}<input type="submit" value="提交">
</form>
<h1>第三种方式(不建议用)</h1>
<form action="" method="post" >{#    {{ myform.as_p }}#}{{ myform.as_ul }}<input type="submit" value="提交">
</form>
</body>
</html>

渲染错误信息

视图文件

# 第一步:先要继承Form
from django import forms
from django.forms import widgets
from django.core.exceptions import ValidationError# 写一个类
class MyForm(forms.Form):# 定义一个属性,可以用来校验字符串类型# 限制最大长度是8,最小长度是3name = forms.CharField(max_length=8, min_length=3, label='用户名',error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},widget=widgets.TextInput(attrs={'class': 'form-control'}))pwd = forms.CharField(max_length=8, min_length=3, required=True, label='密码',error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},widget=widgets.PasswordInput())re_pwd = forms.CharField(max_length=8, min_length=3, required=True, label='确认密码',error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},widget=widgets.PasswordInput())# 校验是否是邮箱格式email = forms.EmailField(label='邮箱', error_messages={'required': '这个必须填', 'invalid': '不符合邮箱格式'})# aa = forms.CharField(label='选择', error_messages={'required': '这个必须填', 'invalid': '不符合邮箱格式'},widget=widgets.CheckboxInput())def clean_name(self):# self:当前form对象name = self.cleaned_data.get('name')if name.startswith('sb'):# 失败,抛异常raise ValidationError('不能以傻逼开头')# 正常,把name返回return namedef clean(self):pwd=self.cleaned_data.get('pwd')re_pwd=self.cleaned_data.get('re_pwd')if pwd==re_pwd:return self.cleaned_dataelse:raise ValidationError('两次密码不一致')# 渲染错误信息
from app01 import models
def index_form(request):# 生成对象时(实例化),需要传入要校验的数据(字典)if request.method == 'GET':myform = MyForm()elif request.method == 'POST':myform = MyForm(request.POST)if myform.is_valid():print(myform.cleaned_data)myform.cleaned_data.pop('re_pwd')models.User.objects.create(**myform.cleaned_data)return redirect('http://www.baidu.com')else:all_error = myform.errors.get('__all__')if all_error:all_error=all_error[0]return render(request, 'indxe3.html', locals())

模板文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"><title>Title</title>
</head>
<body><h1>第二种方式(for循环form对象,建议用这种)</h1>
<form action="" method="post" novalidate>{% for foo in myform %}<p>{{ foo.label }}:{{ foo }} <span>{{ foo.errors.0 }}</span></p>{% endfor %}<input type="submit" value="提交"><span>{{ all_error }}</span>
</form>
</body>
</html>errors存放着错误信息

局部钩子

    def clean_name(self):# self:当前form对象name = self.cleaned_data.get('name')if name.startswith('sb'):# 失败,抛异常raise ValidationError('不能以傻逼开头')# 正常,把name返回return nameclean_name  是拿上面定义的name 返回的信息也是放到 errors字典内 键是name 对应的值内

全局钩子

    def clean(self):pwd=self.cleaned_data.get('pwd')re_pwd=self.cleaned_data.get('re_pwd')if pwd==re_pwd:return self.cleaned_dataelse:raise ValidationError('两次密码不一致')全局钩子  错误的信息存放在 errors 字典内的 __all__ 键对应的值内

from django.shortcuts import render,HttpResponse
import json
from django.http import JsonResponse
# Create your views here.
from django import forms
from django.forms import widgets
from django.core.exceptions import ValidationError
from app01 import modelsclass myForm(forms.Form):name = forms.CharField(max_length=12, min_length=3, label='用户名',error_messages={'max_length': '最长是12', 'min_length': '最短是3', 'required': '必填'},widget=widgets.TextInput(attrs={'class': 'form-control','id':'usr'}))pwd = forms.CharField(max_length=16, min_length=3, label='密码',error_messages={'max_length': '最长16', 'min_length': '最短是3', 'required': '必填'},widget=widgets.PasswordInput(attrs={'class': 'form-control','id':'pwd'}))re_pwd = forms.CharField(max_length=16, min_length=3, label='再次输入密码',error_messages={'max_length': '最长16', 'min_length': '最短是3', 'required': '必填'},widget=widgets.PasswordInput(attrs={'class': 'form-control','id':'pwd2'}))email = forms.EmailField(label='邮箱',error_messages={'required': '必填', 'invalid': '不符合邮箱格式'},widget=widgets.EmailInput(attrs={'class': 'form-control','id':'email'}))def clean_name(self):name=self.cleaned_data.get("name")# print(name)account=models.User.objects.filter(name=name).first()if account:raise ValidationError('该用户名已存在')return namedef clean(self):pwd = self.cleaned_data.get('pwd')# print(pwd)re_pwd = self.cleaned_data.get('re_pwd')if pwd == re_pwd:return self.cleaned_dataelse:raise ValidationError('两次密码不一致')def index(request):if request.method == 'GET':myform = myForm()return render(request, 'index.html', locals())elif request.method == 'POST':# print(request.POST)# print(request.body)ajax1=json.loads(request.body.decode('utf-8'))# print(ajax1)myform = myForm(ajax1)if myform.is_valid():data = myform.cleaned_datadata.pop('re_pwd')models.User.objects.create(**data)return HttpResponse('注册成功')else:return JsonResponse(myform.errors)def index_usr(request):print(request.body)ajax2 = json.loads(request.body.decode('utf-8'))print(ajax2)myform = myForm(ajax2)if myform.is_valid():return HttpResponse(json.dumps('可以使用的用户名'))else:return JsonResponse(myform.errors)

注册功能页面(手撸)views层

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"><title>Title</title>
</head>
<body>
<div class="container-fluid"><div class="row"><div class="col-md-6 col-md-offset-3" id="msg"><form action="" method="post" novalidate>{% for foo in myform %}<p id="{{ foo.auto_id }}">{{ foo.label }}:{{ foo }}</p>{% endfor %}</form><button type="submit" id="btn">注册</button><span id="error"></span></div></div>
</div></body>
<script src="/static/jquery-3.3.1.js"></script>
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
<script>$('#btn').click(function () {var pos_data = {'name': $('#usr').val(),'pwd': $('#pwd').val(),'re_pwd': $('#pwd2').val(),'email': $('#email').val()};var pos = JSON.stringify(pos_data);$.ajax({url: '/index/',type: 'post',data: pos,contentType: 'application/json',dataType: 'json',success: function (data) {for (let i in data) {var error_msg2 = $('<span class="pull-right" style="color: red" id="msg_error" >' + data[i] + '</span>');if (error_msg2) {$('#msg_error').remove()}$('#id_' + i + '').append(error_msg2);if (data['__all__']) {var error_msg = $('<span class="pull-right" style="color: red" id="er_pwd2">' + data['__all__'] + '</span>');if ($('#er_pwd2')) {$('#msg_error').remove()$('#er_pwd2').remove()}$('#id_re_pwd').append(error_msg)} else {$('#er_pwd2').remove()}break;}alert(data)}})});$('#usr').on('blur', function () {var pos_data2 = {'name': $('#usr').val(),};var pos2 = JSON.stringify(pos_data2);$.ajax({url: '/index_usr/',type: 'post',data: pos2,contentType: 'application/json',dataType: 'json',success: function (data) {console.log(data)li='name'if (li in data) {var error_msg2 = $('<span class="pull-right" style="color: red" id="msg_error" >' + data['name'] + '</span>');if (error_msg2) {$('#msg_error').remove()}$('#id_name').append(error_msg2);}else {var error_msg2 = $('<span class="pull-right" style="color: red" id="msg_error" >可以使用的用户名 </span>');if (error_msg2) {$('#msg_error').remove()}$('#id_name').append(error_msg2);}}})})
</script>
</html>

注册功能页面(手撸) index.html

from django.db import models# Create your models here.
class User(models.Model):name=models.CharField(max_length=32)pwd=models.CharField(max_length=32)email=models.EmailField()

models.py

转载于:https://www.cnblogs.com/layerluo/p/9998524.html

Django forms组件相关推荐

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

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

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

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

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

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

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

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

  5. Django之forms组件

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

  6. Auth模块、Forms组件

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

  7. Django ModelForm 组件的应用

    ModelForm组件的应用 ModelForm 组件的创建: 1.创建一个类,该类继承 forms.ModelForm  2.大致组成部分 class ModelNameModelForm(form ...

  8. Django Forms实例

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

  9. 创建组件“ovalshape”失败_Django的forms组件检验字段\渲染模板

    Ⅰ forms组件介绍 注册功能,登录功能,前端需要校验(字段长度,邮箱是否合法....) 前端校验可以没有,后端校验是必须的,使用传统方式 if判断写的很多 借助于forms组件,可以快速实现字段的 ...

最新文章

  1. 简单完整地讲解tensorflow模型的保存和恢复
  2. 诺基亚发布首款高功率小基站SCORE以及Flexi Zone LWA支持能力
  3. OpenBSD 6.0 将移除 Linux 子系统以改进安全
  4. 【TypeScript】箭头函数
  5. java面试题(java基础)
  6. 原生Get请求和Post请求
  7. [学习笔记]Event与Bindable
  8. java jxl 写 excel文件_java采用jxl写入一个Excel文件
  9. python学习ajax_Python开发【第二十三篇】:AJAX全套
  10. java多线程 文件夹_Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合
  11. 退休前后,工资差距有多大?
  12. float和position
  13. ruby设计模式之观察者模式2————更加一般化的观察者模式
  14. java第14次作业
  15. java小程序实例大全_12个用Java编写基础小程序经典案例(收藏)
  16. Java游戏项目开发 王者荣耀 学会你就是最强王者
  17. 落枕、肩颈酸痛,用磁疗就可缓解!
  18. Unity中键名称与键位对应一览
  19. JS 截取身份证号码中 的生日
  20. Linux(CS-Notes)

热门文章

  1. android 固定比例图片裁剪插件,如何在Android中裁剪不同比例的图像?
  2. python求最小值不能使用min和sotred_python基础——内置函数
  3. anaconda写python代码视频_如何安装Python运行环境Anaconda?(视频教程)
  4. python web框架 多线程_python 简单web框架: Bottle
  5. python设置循环范围_python – 如何检查循环范围的重叠(重叠的年度循环周期)
  6. 地表最强的MySQL安装一键式安装,信不信你下完我就给你装好!附各种Mysql安装失败的解决办法(什么你安装失败了?快来看这个)
  7. 分布式事务是啥?常用的解决方案有哪些?
  8. JLINK与JTAG的区别
  9. 外设位宽为8、16、32时,CPU与外设之间地址线的连接方法
  10. 梯度下降法_梯度下降