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. [LeetCode] 923. 3Sum With Multiplicity 三数之和的多种情况

    Given an integer array A, and an integer target, return the number of tuples i, j, k  such that i &l ...

  2. [LeetCode] 350. Intersection of Two Arrays II 两个数组相交之二

    Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...

  3. [LeetCode] 269. Alien Dictionary 另类字典

    There is a new alien language which uses the latin alphabet. However, the order among letters are un ...

  4. [LeetCode] 252. Meeting Rooms 会议室

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  5. [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串

    Given a string s , find the length of the longest substring t  that contains at most 2 distinct char ...

  6. 各IDE快捷键

    [Visual Studio Code] VScode快捷键设置:File -> Perferences -> Keyboard Shortcuts 块注释/**/快捷键  Shift + ...

  7. Java GUI : 实现排序算法的动态演示

    0.用到的jar包 jcommon-1.0.16.jar.jfreechart-1.0.13.jar 1.实现思路 自定义一个类---用于存放排序算法的操作状态--SortEntity 定义一个方法类 ...

  8. java8 List集合的排序,求和,取最大值,按照条件过滤

    public class Java8Test {       public static void main(String[] args) {           Person p1 = new Pe ...

  9. http内网转发

    package main import ( "io" "log" "net/http" "strings" ) func ...

  10. 【git】【Idea】git刷新获取远程分支列表,可以在idea上看到最新的远程分支列表

    [前提:本地项目是从GitLab或gitHub这些远程仓库上拉下来的 ,并且本地安装了git] ==================================================== ...