django的form 登录组件
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 登录组件的更多相关文章
- 《React后台管理系统实战 :一》:目录结构、引入antd、引入路由、写login页面、使用antd的form登录组件、form前台验证、高阶函数/组件
实战 上接,笔记:https://blog.csdn.net/u010132177/article/details/104150177 https://gitee.com/pasaulis/react ...
- django 的form登录 注册
#!/usr/bin/env python # -*- coding: utf8 -*- #__Author: "Skiler Hao" #date: 2017/3/30 15:4 ...
- Django之Form、ModelForm 组件
Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...
- 〖Python〗-- Django的Form组件
[Django的Form组件] Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使 ...
- Django 的 Form组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使用: 1.定义规则: from ...
- Django之Form与ModelForm组件
Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...
- Django之Form组件
Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...
- Python之路【第二十一篇】:Django之Form组件
Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...
- 第十一篇:web之Django之Form组件
Django之Form组件 Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...
随机推荐
- calc()在less中编译报错
calc()对大家来说,或许很陌生,不太会相信calc()是css中的部分.因为看其外表像个函数,既然是函数为何又出现在CSS中呢? calc() 函数用于动态计算长度值. 需要注意的是,运算符前后都 ...
- 洛谷p1137旅行计划
题面 关于拓扑排序 因为这好几次考试的题目里都有在DAG中拓扑排序求最长/短路 txt说它非常的好用 就找了个题做了下 拓扑排序就是寻找图中所有的入度为零的点把他入队 然后再枚举它所有的连到的点,只要 ...
- 牛客CSP-S提高组赛前集训营1———2019.10.29 18:30 至 22:00
期望得分:100+0+10 实际得分:40+0+0 考炸了... T1:题目链接 究竟为什么会这样,,, 仔细研读我的丑代码 发现... 枯辽.... #include<cstdio> # ...
- [LeetCode] 772. Basic Calculator III 基本计算器之三
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- [LeetCode] 222. Count Complete Tree Nodes 求完全二叉树的节点个数
Given a complete binary tree, count the number of nodes. Note: Definition of a complete binary tree ...
- JAVA SE11环境变量配置(Windows)
附上:03. 安装环境:Windows · IntelliJ IDEA Tutorial 附上:使用调试功能进行 Java debug 附上:Linux(Deepin)下配置java8 - L1412 ...
- Codeforces Round #607 (Div. 1) Solution
从这里开始 比赛目录 我又不太会 div 1 A? 我菜爆了... Problem A Cut and Paste 暴力模拟一下. Code #include <bits/stdc++.h> ...
- 【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像
Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new cons ...
- logstash output时区差8个小时
logstash版本6.3.2,解决方式如下,不需要修改源码: input { redis { host => "127.0.0.1" port => " p ...
- 非替代品,MongoDB与MySQL对比分析
IT168 评论]对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数 ...