Django forms组件

校验字段

模板文件

<!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 forms
from 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么要用TypeScript - 肉猪 - 博客园

为什么要用TypeScript 以下是本人的一点拙见&#xff0c;欢迎指正。 TypeScript的设计目的应该是解决JavaScript的“痛点”&#xff1a;弱类型和没有命名空间&#xff0c;导致很难模块化&#xff0c;不适合开发大型程序。另外它还提供了一些语法糖来帮助大家更方便地实践面向…

java继承上机作业

实现如下类之间的继承关系&#xff0c;并编写Music类来测试这些类。 1 package su;2 3 class Instrument{4 public void play() {5 System.out.println("弹奏乐器");6 }7 8 public void play2() {9 // TODO 自动生成的方法存根 10 …

前端之模拟数据 - HackerVirus - 博客园

阅读目录 玩转前端之模拟数据 回到目录 玩转前端之模拟数据 博客园主页&#xff1a;http://www.cnblogs.com/handoing/ 是否还在为前端模拟数据头疼&#xff1f; 是否还在为后端返回数据格式较多内心烦躁&#xff1f; 是否还想吸一支烟压压精&#xff1f; 看下去吧&#x…

Spring Cloud Gateway(五):路由定位器 RouteLocator

本文基于 spring cloud gateway 2.0.1 1、简介 直接 获取 路 由 的 方法 是 通过 RouteLocator 接口 获取。 同样&#xff0c; 该 顶 级 接口 有多 个 实现 类&#xff0c; RouteLocator 路由定位器&#xff0c;顾名思义就是用来获取路由的方法。该路由定位器为顶级接口有多个实…

【NOIP2018】DAY2T2——填数游戏(轮廓线状压的dp?搜索打表)

描述 小 D 特别喜欢玩游戏。这一天&#xff0c;他在玩一款填数游戏。 这个填数游戏的棋盘是一个n m的矩形表格。玩家需要在表格的每个格子中填入一个数字&#xff08;数字 0 或者数字 1&#xff09;&#xff0c;填数时需要满足一些限制。 下面我们来具体描述这些限制。 为了方…

团队开发进度报告9

&#xff08;1&#xff09;站立会议 &#xff08;2&#xff09;任务面板 &#xff08;3&#xff09;具体内容 昨天&#xff1a;完成了界面控件按钮的设置问题&#xff1a;PHP数据处理&#xff0c;如何实现在线数据交互问题今天&#xff1a;hbuilder后台环境搭建 转载于:https:/…

基于springboot多模块项目使用maven命令打成war包放到服务器上运行的问题

首先&#xff0c;大家看到这个问题&#xff0c;可能并不陌生&#xff0c;而且脑子里第一映像就是使用mava中的clear package 或者 clear install进行打包&#xff0c;然后在项目中的target文件夹下面找到xxx.war&#xff0c;将这个war包放到外置的tomcat服务器下的webapps下面&…

Kafka学习笔记(3)----Kafka的数据复制(Replica)与Failover

1. CAP理论 1.1 Cosistency(一致性) 通过某个节点的写操作结果对后面通过其他节点的读操作可见。 如果更新数据后&#xff0c;并发访问的情况下可立即感知该更新&#xff0c;称为强一致性 如果允许之后部分或全部感知不到该更新&#xff0c;称为弱一致性。 若在之后的一段时间&…

H5页面随机数字键盘支付页面

H5页面随机数字键盘支付页面 有个H5支付的业务需要随机数字的键盘 参考了下文&#xff1a;https://blog.csdn.net/Mr_Smile2014/article/details/52473351 做了一些小修改&#xff1a; 在原有的基础上&#xff0c;增加了一些按键反馈的效果。 每个按键加上边框。 最终效果&…

expressjs路由和Nodejs服务器端发送REST请求 - - ITeye博客

Nodejs创建自己的server后&#xff0c;我们如果需要从客户端利用ajax调用别的服务器端的数据API的接口&#xff0c;这时候出现了ajax跨域问题。 一种是利用在客户端解决跨域问题 这种方案大家可以去网上查查 另一种方案是在服务器端去请求别的服务器&#xff0c;然后将数据再…

Jmeter操作mysql数据库测试

1. 选中线程组鼠标点击右键添加-->配置元件-->JDBC Connection Configuration&#xff1b; 2. DataBase Connection Configuration配置 Variable Name&#xff1a;配置元件的的所有配置所保存的变量&#xff0c;自定义变量名称(不能使用mysql作为变量名&#xff0c;多个…

前端“智能”静态资源管理 - Onebox - 博客园

前端“智能”静态资源管理 模块化/组件化开发&#xff0c;仅仅描述了一种开发理念&#xff0c;也可以认为是一种开发规范&#xff0c;倘若你认可这规范&#xff0c;对它的分治策略产生了共鸣&#xff0c;那我们就可以继续聊聊它的具体实现了。 很明显&#xff0c;模块化/组件化…

我们是如何做好前端工程化和静态资源管理 - 無雄 - 博客园

我们是如何做好前端工程化和静态资源管理 随着互联网的发展&#xff0c;我们的业务也日益变得更加复杂且多样化起来&#xff0c;前端工程师也不再只是做简单的页面开发这么简单&#xff0c;我们需要面对的十分复杂的系统性问题&#xff0c;例如&#xff0c;业务愈来愈复杂&…

峰度(Kurtosis)和偏度(Skewness)

峰度&#xff08;Kurtosis&#xff09; 定义峰度又称峰态系数&#xff0c;表征概率密度分布曲线在平均值处峰值高低的特征数&#xff0c;即是描述总体中所有取值分布形态陡缓程度的统计量。直观看来&#xff0c;峰度反映了峰部的尖度。这个统计量需要与正态分布相比较。 公式定…

多功能嵌入式解码软件(2)

多功能嵌入式解码软件&#xff08;2&#xff09; 验证类库 通信协议 下面进行一个示例&#xff1a; 下位机需要向上位机发送3中数据帧&#xff0c;数据帧以功能码来识别&#xff0c;每种数据帧的协议如下3个表格所示&#xff0c;上位机需要把这些数据按照协议解码出来&#xff…

vue项目如何打包扔向服务器 - Hi-Sen - 博客园

当我们将 vue 项目完成后&#xff0c;面临的就是如何将项目进行打包上线&#xff0c;放到服务器中。我使用的是 vue-cli&#xff08;simple&#xff09; 脚手架&#xff0c;所以就讲一下如何将项目进行打包&#xff0c;并放到 tomcat 上。 如果是 vue-cli (非 simple 脚手架…

MySQL备份与恢复-mysqldump备份与恢复

这片博文主要用来介绍MySQL的备份与恢复&#xff1a; MySQL的备份形式可以分为如下几种&#xff1a; 热备----即不停机备份冷备----需要关闭MySQL&#xff0c;然后备份其数据文件。&#xff08;停机备份一般是直接拷贝其datadir目录&#xff09;温备----在线备份&#xff0c;对…

第六次实训作业异常处理

第六次实训作业异常处理 编写一个类ExceptionTest&#xff0c;在main方法中使用try-catch-finally语句结构实现&#xff1a;在try语句块中&#xff0c;编写两个数相除操作&#xff0c;相除的两个操作数要求程序运行时用户输入&#xff1b;在catch语句块中&#xff0c;捕获被0除…

k8s学习笔记-调度之Affinity

Kubernetes中的调度策略可以大致分为两种 一种是全局的调度策略&#xff0c;要在启动调度器时配置&#xff0c;包括kubernetes调度器自带的各种predicates和priorities算法&#xff0c;具体可以参看上一篇文章&#xff1b; 另一种是运行时调度策略&#xff0c;包括nodeAffinity…

MapReduce编程实践

一、MapReduce编程思想 学些MapRedcue主要是学习它的编程思想&#xff0c;在MR的编程模型中&#xff0c;主要思想是把对数据的运算流程分成map和reduce两个阶段&#xff1a; Map阶段&#xff1a;读取原始数据&#xff0c;形成key-value数据&#xff08;map方法&#xff09;。即…