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. AtCoder Beginner Contest 170 D - Not Divisible (数学)

    题意:有一长度为\(n\)的数组,求该数组中有多少元素不能整除其它任一元素的个数. 题解:刚开始写了个分解质因数(我是傻逼),后来发现直接暴力枚举因子即可,注意某个元素出现多次时肯定不满足情况,再特判 ...

  2. 2019 ICPC Asia Taipei-Hsinchu Regional Problem J Automatic Control Machine (DFS,bitset)

    题意:给你\(m\)个长度为\(n\)的二进制数,求最少选多少个使它们\(|\)运算后所有位置均为\(1\),如果不满足条件,则输出\(-1\). 题解:这题\(n\)的范围很大,所以我们先用\(st ...

  3. Python基础--核心数据类型

    python的核心数据类型: Number 数字(整数,浮点数,复数,布尔型数) String 字符串 List 列表 Tuple 元组 Dictionary 字典 Set 集合 1. 整数(整型数) ...

  4. RuntimeError already started

    Env: os: Ubuntu python3 pytorch vscode Desc 在上述环境中运行A3C多进程模型,使用命令行时没问题,使用vscode时出现 'RuntimeError: al ...

  5. Kubernets二进制安装(17)之安装部署Dashboard

    1.下载dashboard镜像 在运维主机(mfyxw50.mfyxw.com)上执行命令 [root@mfyxw50 ~]# docker pull registry.cn-hangzhou.ali ...

  6. 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    既然已经可以通过 RTSP 获取h264 裸流了.那么通过 FFmpeg 将其保存到文件中怎么做呢? 一.首先RTSP获取 h264 裸流 我们上面两篇文章主要讲的是通过 rtsp://Your ip ...

  7. Polya定理应用实例

    关于Polya原理的应用经典实例: 问题:用两种颜色去染排成一个圈的6个棋子,如果通过旋转得到只算作一种.问有多少种染色状态. 解:先将棋子表上号: 1 6   2 5   3 4 那么把所有通过旋转 ...

  8. LOJ6283 数列分块入门 7 (分块 区间加/乘)题解

    题意:区间加,区间乘,单点询问 思路:假设一个点为a,那么他可以表示为m * a + sum,所以区间加就变为m * a + sum + sum2,区间乘变为m * m2 * a + sum * m2 ...

  9. JPG学习笔记3(附完整代码)

    #topics h2 { background: rgba(43, 102, 149, 1); border-radius: 6px; box-shadow: 0 0 1px rgba(95, 90, ...

  10. Emoji of github & twitter

    Emoji cheat sheet http://www.emoji-cheat-sheet.com/ https://github.com/xgqfrms/emoji-cheat-sheet.com ...