1.

了解form 组件的原理

1.建立好form组件 class>>>

2.了解需要先is_valid() 判断是否可以取值

成功 form.cleaned_data 查看成功认证的字典

失败 form.errors  查看失败的键值对

3.自定义 钩子

4.在def clean 比较,通过

form.errors.get("__all__"):
获取哪里的
raise ValidationError("两次密码不一致")
 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body> {#<form action="" method="post">#}
{# {% csrf_token %}#}
{# <p>用户名 <input type="text" name="user" ><span class="error">{{ error.user.0 }}</span></p>#}
{# <p>密码 <input type="password" name="pwd"> <span class="error">{{ error.pwd.0 }}</span></p>#}
{# <p>邮箱 <input type="text" name="email"> <span class="error">{{ error.email.0 }}</span></p>#}
{# <input type="submit">#}
{# #}
{#</form>#}
<h3>reg第一种</h3>
{#<form action="" method="post">#}
{# #}
{# {% csrf_token %}#}
{# {{ form.as_p }}#}
{# <input type="submit">#}
{#</form>#} <h3>reg第二种即使写错了也会保留输入的信息</h3>
{#<div class="container">#}
{# <div class="row">#}
{# <div class="col-md-8 col-md-offset-2">#}
{# <form action="" method="post" novalidate>#}
{# {% csrf_token %}#}
{# <p> 用户名 {{ form.user }}<span class="error">{{ errors.user.0 }}</span> </p>#}
{# <p>密码 {{ form.pwd }}<span class="error">{{ errors.pwd.0 }}</span></p>#}
{# <p>邮箱 {{ form.email }}<span class="error">{{ errors.email.0 }}</span></p>#}
{##}
{# <input type="submit" class="btn btn-success pull-right">#}
{# </form>#}
{# </div>#}
{# </div>#}
{#</div>#}
{##} <h3>reg第三种 完美版</h3>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<form action="" method="post" novalidate>
{% csrf_token %}
{% for foo in form %} <div class="from-group">
<label for="">{{ foo.label }}</label>
{# 这里的foo的属性为 form表单的一系类标签#}
{# foo.errors.0 指的是当出现错误信息返回时,错误信息是以表单的字段位键,值是错误信息,以取得 #}
{{ foo }} <span class="error">{{ foo.errors.0 }}</span>
{# 当返回的是自定义错误时,需要在def clean拿变区分是否两次密码一样,取到的在__all__里面#}
{% if foo.label == "确认密码" %}
<span class="errors">{{ g_error|default:"" }}</span> {% endif %} </div>
{% endfor %}
<input type="reset">
<input type="submit" class="btn btn-success pull-right"> </form>
</div>
</div>
</div> </body>
</html>

reg.html

 from django.shortcuts import render, HttpResponse

 # Create your views here.
# 1.引入自定义条件和form
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
from django import forms
from django.forms import widgets class UserFrom(forms.Form):
msg = {"required": "该字段不能为空"}
user = forms.CharField(min_length=5, label="用户名", error_messages=msg,
widget=widgets.TextInput(attrs={"class": "form-control"}))
pwd = forms.CharField(error_messages=msg, label="密码", widget=widgets.TextInput(attrs={"class": "form-control"})) r_pwd = forms.CharField(error_messages=msg,
min_length=5,
label="确认密码",
widget=widgets.PasswordInput(attrs={"class": "form-control"}))
email = forms.EmailField(error_messages={"invalid": "邮箱格式错误"},
label="邮箱",
widget=widgets.EmailInput(attrs={"class": "form-control"})) def clean_user(self):
val = self.cleaned_data.get("user") # 从cleaned_data取到user
ret = UserInfo.objects.filter(user=val).first() # 在数据库列表中找到user的字典
if not ret: # 不存在,返回user,再讲user传递给数据库进行录入
return val
else:# 这里讲错误的信息传递给error
raise ValidationError("用户名已经处在!") def clean_pwd(self):
val = self.cleaned_data.get("pwd")
if val.isdigit():
return ValidationError("密码不能是纯数字") # 这里讲错误的信息传递给error
else:
return val def clean(self):#这里源码是 返回self.cleaned_data,需要在这里进行比对,若果错误的话返回一个错误的信息返回
pwd = self.cleaned_data.get("pwd")
r_pwd = self.cleaned_data.get("r_pwd") if pwd and r_pwd:
if pwd == r_pwd:#这里要清除错误的键值对,因为auth_user 没有r_password
del self.cleaned_data["r_pwd"] return self.cleaned_data
else:
raise ValidationError("两次密码不一致")
else:
return self.cleaned_data from app01.models import UserInfo def reg(request):
if request.method == "POST":
print("request.POST", request.POST) # 打印post请求 form = UserFrom(request.POST)
print("form", form)
if form.is_valid():
print("form.cleaned_data.user", form.cleaned_data) # 打印通过is_valid一串字典,以form字段为键的字典
UserInfo.objects.create(**form.cleaned_data)
return HttpResponse("OK")
else:
errors = form.errors
print("form.errors", form.errors) # 接收到以form为字段的键,含错误信息的值
print("form.cleaned_data", form.cleaned_data) # 打印录入的字典
# print(form.errors.get("user")[0])#从error中精确获取值
print("------>", form.errors.get("__all__"))#将在def clean方法的错误信息返回 if form.errors.get("__all__"): # 获取全局的变量
g_error = form.errors.get("__all__")[0] # 将错误返回
return render(request, "reg.html", locals()) else:
form = UserFrom()
return render(request, "reg.html", locals())

views

django的form 登录组件的更多相关文章

  1. 《React后台管理系统实战 :一》:目录结构、引入antd、引入路由、写login页面、使用antd的form登录组件、form前台验证、高阶函数/组件

    实战 上接,笔记:https://blog.csdn.net/u010132177/article/details/104150177 https://gitee.com/pasaulis/react ...

  2. django 的form登录 注册

    #!/usr/bin/env python # -*- coding: utf8 -*- #__Author: "Skiler Hao" #date: 2017/3/30 15:4 ...

  3. Django之Form、ModelForm 组件

    Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...

  4. 〖Python〗-- Django的Form组件

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

  5. Django 的 Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使用: 1.定义规则: from ...

  6. Django之Form与ModelForm组件

    Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...

  7. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

  8. Python之路【第二十一篇】:Django之Form组件

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

  9. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

随机推荐

  1. TensorFlow基础篇

    Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算.TensorFlow的运行机制属于“定义”和“运行”相分离.模型的构建只是相当于定义了一个图结构(代表一个计算任务),图中有 ...

  2. Linux性能优化实战学习笔记:第十三讲

    问题1:性能工具版本太低,导致指标不全 解决方案1: 这是使用 CentOS 的同学普遍碰到的问题.在文章中,我的pidstat 输出里有一个 %wait 指标,代表进程等待 CPU 的时间百分比, ...

  3. SpringBootThymeleaf案例

    一.添加依赖 <!-- 添加thymeleaf模版的依赖 --> <dependency> <groupId>org.springframework.boot< ...

  4. 修改Launchpad的命令

    修改Launchpad命令 1.设置Launchpad 图标的列数 defaults write com.apple.dock springboard-columns -int 10 2.设置 Lau ...

  5. java8之行为参数化

    今天看到一块switch代码,觉得又臭又长,可以优化一下,只需要将函数名作为入参进行改造,有点类似于策略模式. 以下是使用Java8进行行为参数化的简单案例: User.java import lom ...

  6. cloudstack4.11 centos7 安装文档

    centos 7.x  cloudstack 4.11 提示:生产环境 建议用ceph 块存储为主存储, 这里测试使用的是nfs主存储     组件 172.16.19.116  cloudstack ...

  7. 【网络知识之二】HTTP协议

    HTTP协议(Hypertext Transfer Protocol,超文本传输协议),一种无状态的.应用层的.以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系 ...

  8. Nginx开启gzip提高页面加载速度

    今天发现页面多次请求数据且加载的数据大,需要等待的时间很长 记得Nginx有gzip,可以对数据进行压缩 gzip是nginx服务器的ngx_http_gzip_module模块提供的在线实时数据压缩 ...

  9. SpringBoot 基于web应用开发(请求参数获取,静态资源,webjars)

    SpringBoot 基于web应用开发 一.Lombok使用 1.导入依赖库 <dependency>    <groupId>org.projectlombok</g ...

  10. MySQL 快速添加百万条数据

    需要向数据库添加100W条测试数据,直接在普通表中添加速度太慢,可以使用内存表添加,然后将内存表数据复制到普通表 创建表 # 内存表 DROP TABLE IF EXISTS `test_memory ...