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. 洛谷 P1016 旅行者的预算

    传送门 感觉自己连点生活常识都没有,竟然连油用过之后要减去都不知道,这种贪心模拟题都做不出来--思路在代码里,我菜死了 思路&&代码 //看题解过的..一点都没有成就感 #includ ...

  2. [LeetCode] 417. Pacific Atlantic Water Flow 太平洋大西洋水流

    Given an m x n matrix of non-negative integers representing the height of each unit cell in a contin ...

  3. 第30课 线程同步(std::condition_variable)

    一. 条件变量 (一)条件变量概述 多线程访问一个共享资源(或称临界区),不仅需要用互斥锁实现独享访问避免并发错误,在获得互斥锁进入临界区后,还需检查特定条件是否成立.当某个线程修改测试条件后,将通知 ...

  4. Navicat Premium 12 安装与激活

    一.Navicat Premium 12下载 官方下载地址:https://www.navicat.com.cn/download/navicat-premium 百度云盘:https://pan.b ...

  5. "中台"论再议

    前言:讲中台的太多了,好像似乎不提中台就没法在IT圈混,但对中台又缺少统一明确的定义,姑且听其言,择其精华.最近看到一篇将中台的,觉得还不错,记录下来,分享给大家. 硅谷的“中台论” 在国内创立智领云 ...

  6. 转《深入理解 Java 内存模型》读书笔记

    转:https://mp.weixin.qq.com/s/2hA6u4hLEPWlTPdD-XB-bg 前提 <深入理解 Java 内存模型>程晓明著,该书在以前看过一遍,现在学的东西越多 ...

  7. 【模板】KD-tree

    核心思想: 将空间内的点进行合理划分,以支持有关高维点的操作. 其实就是将线段树搬到了二维及更高维度上. 注意$KD-tree$虽然很像线段树,但其实是一棵二叉搜索树,空间复杂度是$O(n)$的. 查 ...

  8. windows10下录屏

    windows10自带了录屏功能.运行win+G即可打开.如果出现错误,可以运行如下PS脚本. https://files.cnblogs.com/files/mqingqing123/reinsta ...

  9. go ---MQTT client

    Paho GO Client   语言 GO 协议 EPL AND EDL 官网地址 http://www.eclipse.org/paho/ API类型 Asynchronous  描述 Paho ...

  10. Java匹马行天下之JavaSE核心技术——工具类

    Java匹马行天之JavaSE核心技术——工具类 一.Object类 java.lang.ObjectObject类是所有类直接或间接的父类 常用的方法: toString():以字符串形式返回对象的 ...