Django 登入效验

.py

from django import forms
from student import models
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator class RegForm(forms.Form):
username = forms.CharField(
max_length=16,
label="用户名",
widget=forms.widgets.TextInput(attrs={"class": "form-control"},),
error_messages={
"max_length": "用户名最长16位",
"required": "用户名不能为空",
}
)
password = forms.CharField(
min_length=6,
max_length=10,
label="密码",
widget=forms.widgets.PasswordInput(attrs={"class": "form-control"},),
error_messages={
"max_length": "最小长度为6",
"required": "密码不能为空",
}
)
re_password = forms.CharField(
min_length=6,
max_length=10,
label="确认密码",
widget=forms.widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True),
error_messages={
"min_length": "密码最少6位",
"required": "密码不能为空",
}
)
gender = forms.ChoiceField(
choices=(('男', "男"), ('女', "女")),
label="性别",
initial=1,
widget=forms.widgets.RadioSelect
)
age = forms.CharField(
max_length=10,
label="年龄",
widget=forms.widgets.TextInput(attrs={"class": "form-control"}), )
addr = forms.CharField(
max_length=32,
label="地址",
widget=forms.widgets.TextInput(attrs={"class": "form-control"}),
error_messages={
"required": "地址不能为空",
}
)
phone = forms.CharField(
label="手机",
validators=[
RegexValidator(r'^1[3-9][0-9]{9}$', '手机格式不正确')
],
widget=forms.widgets.TextInput(attrs={"class": "form-control"}),
error_messages={
"required": "手机不能为空"
}
) # 重写username字段的局部钩子
def clean_username(self):
username = self.cleaned_data.get("username")
is_exist = models.Student.objects.filter(username=username)
if is_exist:
# 表示用户名已注册
self.add_error("username", ValidationError("用户名已存在!"))
else:
return username # 重写全局的钩子函数, 对确认密码做效验
def clean(self):
password = self.cleaned_data.get("password")
re_password = self.cleaned_data.get("re_password")
if re_password and re_password != password:
self.add_error("re_password", ValidationError("两次密码不一致"))
else:
return self.cleaned_data

.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/mystyle.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form novalidate action="/reg/" method="post" class="form-horizontal reg-form"> {# autocomplete="off"自动补全 #}
{% csrf_token %}
<div class="form-group">
<label for="{{ form_obj.username.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.username.label }}</label>
<div class="col-sm-10">
{{ form_obj.username }}
<span class="help-block">{{ form_obj.username.errors.0 }}</span>
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.password.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.password.label }}</label>
<div class="col-sm-10">
{{ form_obj.password }}
<span class="help-block">{{ form_obj.password.errors.0 }}</span>
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.re_password.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.re_password.label }}</label>
<div class="col-sm-10">
{{ form_obj.re_password }}
<span class="help-block">{{ form_obj.re_password.errors.0 }}</span>
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.gender.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.gender.label }}</label>
<div class="col-sm-10">
{{ form_obj.gender }}
<span class="help-block">{{ form_obj.gender.errors.0 }}</span>
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.age.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.age.label }}</label>
<div class="col-sm-10">
{{ form_obj.age }}
<span class="help-block">{{ form_obj.age.errors.0 }}</span>
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.addr.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.addr.label }}</label>
<div class="col-sm-10">
{{ form_obj.addr }}
<span class="help-block">{{ form_obj.addr.errors.0 }}</span>
</div>
</div>
<div class="form-group">
<label for="{{ form_obj.phone.id_for_label }}" class="col-sm-2 control-label">{{ form_obj.phone.label }}</label>
<div class="col-sm-10">
{{ form_obj.phone }}
<span class="help-block">{{ form_obj.phone.errors.0 }}</span>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-sm-10">
<button type="submit" class="btn btn-success" id="reg-submit">注册</button>
</div>
</div>
</form>
</div>
</div>
</div>
<script src="/static/jquery-3.3.1.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
{#<script>#}
{# // 找到头像的input标签绑定change事件#}
{# $("#id_avatar").change(function(){#}
{# //alert("123")#}
{# // 1.读取你选中的那个文件#}
{# var fileReader = new FileReader();#}
{# // 取到你选中的那个文件#}
{# //console.log(this.files[0]);#}
{# //读取你选中的那个文件#}
{# fileReader.readAsDataURL(this.files[0]);// 读取文件是需要时间的#}
{# fileReader.onload = function () {#}
{# //2.登上一部读完文件之后才把文件加载到img标签中#}
{# $("#avatar-img").attr("src", fileReader.result);#}
{# };#}
{# });#}
{# // AJAX提交注册的数据#}
{# $("#reg-submit").click(function () {#}
{# // 取到用户发送的请求数据,向后端发送AJAX请求#}
{# //var username = $("#id_username").val();#}
{# //var password = $("#id_password").val();#}
{# //var re_password = $("#id_re_password").val()#}
{# //var email = $("#id_email").val();#}
{##}
{# var formData = new FormData()#}
{# formData.append("username", $("#id_username").val());#}
{# formData.append("password", $("#id_password").val());#}
{# formData.append("re_password", $("#id_re_password").val());#}
{# formData.append("phone", $("#id_phone").val());#}
{# formData.append("email", $("#id_email").val());#}
{# formData.append("avatar", $("#id_avatar")[0].files[0]);#}
{# formData.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());#}
{# $.ajax({#}
{# url:"/reg/",#}
{# type:"post",#}
{# processData: false,// 告诉jQuery不要处理我的数据#}
{# contentType: false,// 告诉jQuery不要设置content类型#}
{# data:formData,#}
{# success:function (data) {#}
{# if(data.status){#}
{# //有错误就展示错误#}
{# //console.log(data.msg);#}
{# //将报错信息写到页面上#}
{# $.each(data.msg, function (k,v) {#}
{# $("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error");#}
{# })#}
{# }else{#}
{# //没有错误就跳转到指定页面#}
{# location.href = data.msg;#}
{# }#}
{##}
{# }#}
{# });#}
{# //将所有的input框架定获取焦点事件,将所有的错误信息清空#}
{# $("form input").focus(function () {#}
{# $(this).next().text("").parent().parent().removeClass("has-error");#}
{# })#}
{# });#}
{# // 给username input框绑定一个时区焦点的事件, 失去焦点之后就效验用户名是否存在#}
{# $("#id_username").blur(function() {#}
{# //$("#id_username").on("input", function () {}) 边写边效验#}
{# //alert(123);失去焦点就弹窗#}
{# //取到用户填的值#}
{# var username = $(this).val();#}
{# // 发请求#}
{# $.ajax({#}
{# url: "/check_username_exist/",#}
{# type: "get",#}
{# data: {"username": username},#}
{# success: function (data) {#}
{# if (data.status) {#}
{# //用户名已被注册#}
{# $("#id_username").next().text(data.msg).parent().parent().addClass("has_error");#}
{# }#}
{# }#}
{# })#}
{# })#}
{#</script>#}
</body>
</html>

django Form 效验的更多相关文章

  1. Django form表单 组件

    目录 Django form表单 组件 Form 组件介绍 普通方式手写注册功能 使用form组件实现注册功能 Form 常用字段与插件 常用字段(必备) 字段参数(必备) 内置验证(必备) 自定义效 ...

  2. django: form fileupload - 1

    本节介绍 Form 中一些字段类型的使用,以文件上传字段 FileField 为例:(注,其它字段和相关用法见官方文档中的 Forms -> Built-in Fields) 一,配置 urls ...

  3. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

  4. Django form模块使用心得

    最近用Django 写了一个网站,现在来分享一下对Django form 的一些心得. 一,创建一个表单 创建一个Form表单有两种方式: 第一种方式是继承于forms.Form,的一个子类,通过在f ...

  5. Python Web框架篇:Django Form组件

    Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...

  6. Django form表单

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

  7. django Form组件

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

  8. Django Form和ModelForm组件

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

  9. 9.24 Django Form组件

    2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...

随机推荐

  1. Go语言中时间轮的实现

    最近在工作中有一个需求,简单来说就是在短时间内会创建上百万个定时任务,创建的时候会将对应的金额相加,防止超售,需要过半个小时再去核对数据,如果数据对不上就需要将加上的金额再减回去. 这个需求如果用Go ...

  2. vs2019 写入访问权限冲突

    先说句题外话 vs反应有时候有点慢,改过的地方等几秒才会显示正确 另外有时候正确的地方会报错,重启吧 回到正题 "引发了异常: 写入访问权限冲突._Left 是 0xCDCDCDCD.如有适 ...

  3. Leetcode(14)-最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  4. Spring框架整合Mybatis项目

    第一步:导入相关依赖jar包 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybat ...

  5. ES6 Generator vs ES6 async/await

    ES6 Generator vs ES6 async/await next yield promise refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允 ...

  6. js type automatic conversion

    js type automatic conversion String & Number `255` < 16; false `15` < 16; true `25` < 1 ...

  7. javascript disable scroll event

    javascript disable scroll event Document: scroll event https://developer.mozilla.org/en-US/docs/Web/ ...

  8. Baccarat项目专用代币BGV的价值如何?

    NGK投资者对于NGK平台自身的DeFi项目呼声越来越高,经过数月的紧张研发,检验和内测工作,NGK官方将于近日推出其去中心化金融项目--Baccarat,此项目为避免以太坊易被攻击,网络拥堵出块慢以 ...

  9. C++算法代码——你要乘坐的飞碟在这里[usaco]

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1056 题目描述 一个众所周知的事实,在每一慧星后面是一个不明飞行物UFO. 这些不明 ...

  10. 死磕以太坊源码分析之EVM指令集

    死磕以太坊源码分析之EVM指令集 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. 以下指令集 ...