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. GYM101810 ACM International Collegiate Programming Contest, Amman Collegiate Programming Contest (2018) M. Greedy Pirate (LCA)

    题意:有\(n\)个点,\(n-1\)条边,每条边正向和反向有两个权值,且每条边最多只能走两次,有\(m\)次询问,问你从\(u\)走到\(v\)的最大权值是多少. 题解:可以先在纸上画一画,不难发现 ...

  2. Python 往Excel写数据

    一.需求描述: 1.一张人员信息表中生成人员信息,某些列的字段要进行递增操作: 2.一个组织节点下存在1000人的限制要求: 3.一张Excel表格生成45000条数据: 二.Excel表格的表头如下 ...

  3. bitbar 网站攻击实验

    实验环境 https://github.com/TouwaErioH/security/tree/master/web1 Windows10 Oracle VM VirtualBox Ubuntu16 ...

  4. redis运维与开发笔记

  5. git-reset All In One

    git-reset All In One git 撤销 merge $ git checkout feature-sentry $ git pull $ git checkout dev $ git ...

  6. GIF : 超好用的gif 图片制作工具: LICEcap

    超好用的gif 图片制作工具: LICEcap simple animated screen captures http://www.cockos.com/licecap/https://github ...

  7. JS Object Deep Copy & 深拷贝

    JS Object Deep Copy & 深拷贝 针对深度拷贝,需要使用其他方法 JSON.parse(JSON.stringify(obj));,因为 Object.assign() 拷贝 ...

  8. node os env reader

    node os env reader node-os-env-reader.js #!/usr/bin/env node "use strict"; /** * * @author ...

  9. js 反应&行动

    反应 class Reaction { _page = 1; get page() { return this._page; } set page(newValue) { this._page = n ...

  10. 未来,Baccarat将如何拓展生态版图?

    Baccarat最近几度冲上DeFi版面的热搜,一是因为BGV价格不断的上涨,二是因为生态建设者的不断涌入.可以说,当下的Baccarat,实在是太火爆了.那么在未来,Baccarat还将会持续火爆吗 ...