Django基于Form之登录和注册
1、创建Forms文件,内容略多,大家将就着看,不懂请留言
#!/usr/bin/env python
# -*- coding: utf8 -*-
#__Author: "Skiler Hao"
#date: 2017/3/30 15:40
from django.core.exceptions import ValidationError
from django import forms
from django.forms import fields
from django.forms import widgets
from django.core.validators import RegexValidator
from respository import models class RegisterForm(forms.Form):
username = fields.CharField(
required=True,
widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': '用户名为8-12个字符'}),
min_length=6,
max_length=12,
strip=True,
error_messages={'required': '标题不能为空',
'min_length': '用户名最少为6个字符',
'max_length': '用户名最不超过为20个字符'},
)
email = fields.EmailField(
required=True,
widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': '请输入邮箱'}),
strip=True,
error_messages={'required': '邮箱不能为空',
'invalid':'请输入正确的邮箱格式'},
)
pwd = fields.CharField(
widget=widgets.PasswordInput(attrs={'class': "form-control",'placeholder': '请输入密码,必须包含数字,字母,特殊字符'},render_value=True),
required=True,
min_length=6,
max_length=12,
strip=True,
validators=[
# 下面的正则内容一目了然,我就不注释了
RegexValidator(r'((?=.*\d))^.{6,12}$', '必须包含数字'),
RegexValidator(r'((?=.*[a-zA-Z]))^.{6,12}$', '必须包含字母'),
RegexValidator(r'((?=.*[^a-zA-Z0-9]))^.{6,12}$', '必须包含特殊字符'),
RegexValidator(r'^.(\S){6,10}$', '密码不能包含空白字符'),
], #用于对密码的正则验证
error_messages={'required': '密码不能为空!',
'min_length': '密码最少为6个字符',
'max_length': '密码最多不超过为12个字符!',},
)
pwd_again = fields.CharField(
#render_value会对于PasswordInput,错误是否清空密码输入框内容,默认为清除,我改为不清楚
widget=widgets.PasswordInput(attrs={'class': "form-control",'placeholder': '请再次输入密码!'},render_value=True),
required=True,
strip=True,
error_messages={'required': '请再次输入密码!',} ) def clean_username(self):
# 对username的扩展验证,查找用户是否已经存在
username = self.cleaned_data.get('username')
users = models.User.objects.filter(username=username).count()
if users:
raise ValidationError('用户已经存在!')
return username def clean_email(self):
# 对email的扩展验证,查找用户是否已经存在
email = self.cleaned_data.get('email')
email_count = models.User.objects.filter(email=email).count() #从数据库中查找是否用户已经存在
if email_count:
raise ValidationError('该邮箱已经注册!')
return email def _clean_new_password2(self): #查看两次密码是否一致
password1 = self.cleaned_data.get('pwd')
password2 = self.cleaned_data.get('pwd_again')
if password1 and password2:
if password1 != password2:
# self.error_dict['pwd_again'] = '两次密码不匹配'
raise ValidationError('两次密码不匹配!') def clean(self):
#是基于form对象的验证,字段全部验证通过会调用clean函数进行验证
self._clean_new_password2() #简单的调用而已 class loginForm(forms.Form):
username = fields.CharField(
required=True,
widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': '请输入用户名'}),
min_length=6,
max_length=12,
strip=True,
error_messages={'required': '用户名不能为空',}
) pwd = fields.CharField(
widget=widgets.PasswordInput(attrs={'class': "form-control",'placeholder': '请输入密码'}),
required=True,
min_length=6,
max_length=12,
strip=True,
error_messages={'required': '密码不能为空!',}
) def clean(self):
username = self.cleaned_data.get('username')
pwd = self.cleaned_data.get('pwd')
user = models.User.objects.filter(username=username).first()
if username and pwd:
if not user : # self.error_dict['pwd_again'] = '两次密码不匹配'
raise ValidationError('用户名不存在!')
elif pwd != user.password:
raise ValidationError('密码不正确!')
forms.py
2、login.html和register.html页面
{% extends 'base/base.html' %}
{% block head-resource %}
{% load my_tags %}
<!-- Custom styles for this template -->
<link href="/static/css/signin.css" rel="stylesheet">
{% endblock %}
{% block body-content %}
<div class="container">
<form class="form-signin" method="post" action="/login/" novalidate>{% csrf_token %}
{# <h2 class="form-signin-heading">Please sign in</h2>#}
<label for="username">用户名</label>
{{ form.username }} <span style="color: red">{{ form.username.errors }}</span>
<label for="username">密码</label>
{{ form.pwd }} <span style="color: red">{{ form.username.errors }}</span>
<span style="color: red">
{% if form|all_errors %}
{{ form|all_errors }}
{% endif %}
</span>
<div class="form-group">
<label for="password">验证码</label>
<div class="row">
<div class="col-xs-7">
<input type="text" class="form-control" name="check_code" id="check_code" placeholder="请输入验证码">
</div>
<div class="col-xs-5">
<img id="check_code_img" src="/create_code_img/" onclick="refresh_check_code(this)">
{# src是url路径,可得到验证码图片,点击时调用refresh_check_code#}
</div>
</div>
<span style="color: red">{{ errors.check_code }}</span>
</div>
<div class="checkbox">
<label>
<input type="checkbox" value="1" name="auto_login"> 一个月内自动登陆
</label>
<div class="right">
<a href="#">忘记密码?</a>
</div>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
<span>还没有账号?<a href="/register/">立即注册</a></span>
</form>
</div> <!-- /container -->
{% endblock %}
{% block body-js %}
<script>
function refresh_check_code(ths) {
ths.src += '?';
{# src后面加问好会自动刷新验证码img的src#}
}
</script>
{% endblock %}
login.html
{% load my_tags %}
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css"/>
<link rel="stylesheet" href="/static/plugins/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="/static/css/edmure.css"/>
<link rel="stylesheet" href="/static/css/commons.css"/>
<link rel="stylesheet" href="/static/css/account.css"/>
<style>
</style>
</head>
<body>
<div class="register">
<div style="font-size: 25px; font-weight: bold;text-align: center;">
用户注册
</div>
<form role="form" action="/register/" method="POST" novalidate="NOVALIDATE">{% csrf_token %}
<div class="form-group">
<label for="username">用户名</label>
{{ form.username }} <span style="color: red">{{ form.username.errors }}</span>
</div>
<div class="form-group">
<label for="email">邮箱</label>
{{ form.email }}<span style="color: red">{{ form.email.errors }}</span>
</div>
<div class="form-group">
<label for="password">密码</label>
{{ form.pwd }}<span style="color: red">{{ form.pwd.errors.0 }}</span>
</div>
<div class="form-group">
<label for="confirm_password">确认密码</label>
{{ form.pwd_again }}
<span style="color: red">
{{ form.pwd_again.errors.0 }}
{% if form|all_errors %}
{{ form|all_errors }}
{% endif %}</span>
</div>
<input type="submit" class="btn btn-default" value="注册"/>
<span>已有账号?<a href="/login/">直接登录</a></span>
</form>
</div>
</body>
</html>
register
页面还有一些不合理的地方,欢迎大家批评指正
3、views视图内容
import datetime
from django.shortcuts import render,redirect,HttpResponse
from io import BytesIO from respository import models
from utils import pagination
from backend.forms import forms
from utils import check_code
# Create your views here. def login(request):
# print(request.POST)
if request.method == 'GET':
obj = forms.loginForm()
# print('GET')
return render(request,'login.html',{'form':obj}) elif request.method == 'POST':
# print(request.POST)
obj = forms.loginForm(request.POST)
errors = {}
if obj.is_valid():
post_check_code = request.POST.get('check_code')
session_check_code = request.session['check_code']
if post_check_code.lower() == session_check_code.lower() :
# values = obj.clean()
data = obj.cleaned_data
# print(data)
# print(data)
# print(obj.errors)
# print('POST')\
if request.POST.get('auto_login'):
request.session.set_expiry(60 * 60 * 24 *30)
request.session['is_login'] = 'true'
request.session['user'] = data.get('username')
print(request.session['username'])
return redirect('/')
else:
# print(obj.errors)
errors['check_code'] = '请输入正确的验证码!'
return render(request, 'login.html', {'form': obj,'errors':errors}) return render(request,'login.html',{'form':obj}) def logout(request):
try:
#删除is_login对应的value值
del request.session['is_login']
del request.session['user']
except KeyError:
pass
#点击注销之后,直接重定向回登录页面
return redirect('/login/') def register(request):
# username = models.CharField(max_length=16, verbose_name='用户名')
# password = models.CharField(max_length=16, verbose_name='密码')
# nickname = models.CharField(max_length=16,verbose_name='昵称')
# email = models.EmailField(max_length=16, verbose_name='邮箱')
# img = models.ImageField(verbose_name='头像',upload_to='static/img/user/',default='static/img/user/1.jpg')
# ctime = models.DateTimeField(auto_created=True,verbose_name='创建时间') if request.method == 'GET':
obj = forms.Register()
# return render(request,'register.html',{'form':obj})
elif request.method == 'POST':
# print(request.POST)
obj = forms.Register(request.POST)
post_check_code = request.POST.get('check_code')
session_check_code = request.session['check_code']
print(post_check_code,session_check_code)
if obj.is_valid():
if post_check_code == session_check_code:
# values = obj.clean()
data = obj.cleaned_data
print(data)
# models.User.objects.create(
username= data.get('username')
password= data.get('pwd')
email= data.get('email')
nickname = data.get('username')
# )
models.User.objects.create(username=username,nickname =nickname,password =password,email = email )
request.session['is_login'] = 'true'
request.session['user'] = data.get('username')
return redirect('/')
else:
errors = obj.errors
print('hello') return render(request,'register.html',{'form':obj}) def article(request,*args,**kwargs):
print(kwargs)
return redirect('/') # 将check_code包放在合适的位置,导入即可,我是放在utils下面
from utils import check_code def create_code_img(request):
f = BytesIO() #直接在内存开辟一点空间存放临时生成的图片 img, code = check_code.create_validate_code() #调用check_code生成照片和验证码
request.session['check_code'] = code #将验证码存在服务器的session中,用于校验
img.save(f,'PNG') #生成的图片放置于开辟的内存中
return HttpResponse(f.getvalue()) #将内存的数据读取出来,并以HttpResponse返回
views
4、说明:
urls和数据的创建我就不粘贴了,希望大家看了有所得,一起进步
Django基于Form之登录和注册的更多相关文章
- Django基于form组件实现注册校验
一 基本流程 1 创建form组件对应的类,比如LoginForm 2 前端的三种渲染方式: 渲染方式三种: 1 <form action="" novalidate met ...
- Django实战(一)-----用户登录与注册系统6(session会话、注册视图)
因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的. 通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于 ...
- Django实战(一)-----用户登录与注册系统5(图片验证码)
为了防止机器人频繁登录网站或者破坏分子恶意登录,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是一种区分用户是计算机还是人的公共全自动程序. 可以防止恶意破解密码.刷票.论坛 ...
- Django实战(一)-----用户登录与注册系统4(表单)
我们前面都是手工在HTML文件中编写表单form元素,然后在views.py的视图函数中接收表单中的用户数据,再编写验证代码进行验证,最后使用ORM进行数据库的增删改查.这样费时费力,整个过程比较复杂 ...
- Django实战(一)-----用户登录与注册系统2(数据模型、admin后台、路由视图)
使用Django开发Web应用的过程中,很多人都是急急忙忙地写视图,写前端页面,把最根本的模型设计给忽略了. 模型中定义了数据如何在数据库内保存,再直白点说就是数据表的定义.这部分工作体现在Djang ...
- django 基于form表单上传文件和基于ajax上传文件
一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...
- Django中用 form 实现登录注册
1.forms模块 将Models和Forms结合到一起使用,将Forms中的类和Models中的类关联到一起,实现属性的共享 1.在forms.py中创建class,继承自forms.ModelFo ...
- python利用django实现简单的登录和注册,并利用session实现了链接数据库
利用session实现与数据库链接,登录模块(在views.py) def login(request): # return HttpResponseRedirect('/') # 判断是否post方 ...
- Django实战(一)-----用户登录与注册系统3(前端页面、登录视图)
基本框架搭建好了后,我们就要开始丰富页面内容了.最起码,得有一个用户登录的表单不是么?(注册的事情我们先放一边.) 一. 原生HTML页面 删除原来的login.html文件中的内容,写入下面的代码: ...
随机推荐
- [java]Stream API——map和flatMap的区别
map方法 map的含义为映射.是指对于Stream中包含的每一个元素使用给定的转换函数进行转换. map传入的Lambda表达式必须是Function实例,参数可以为任意类型,而其返回值也是任性类型 ...
- Android程序的安装和打包
Android程序的安装和打包
- JavaScript encodeURIComponent()
■ 把字符串作为 URI 组件进行编码.JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unes ...
- 初识HTML和CSS
HTML 1.一套规则,浏览器认识的规则. 2.开发者: 学习Html规则 开发后台程序: - 写Html文件(充当模板的作用) ****** - 数据库获取数据,然后替换到html文件的指定位置(W ...
- WPF:理解TileBrush(ImageBrush,DrawingBrush和VisualBrush)
ImageBrush:利用图像绘制区域 ImageBrush 是一种将自身内容定义为图像的 TileBrush,图像通过它的 ImageSource 属性指定. 您可以控制图像的拉伸.对齐和平铺方式, ...
- dom&bom的起源,方法,内容,应用
Document Object Model的历史可以追溯至1990年代后期微软与Netscape的"浏览器大战"(browser wars),双方为了在JavaScript与JSc ...
- Day10 - Python异步IO、Pymysql、paramiko、
IO多路复用: 参考博客:http://www.cnblogs.com/wupeiqi/p/6536518.html socket客户端(爬虫): http://www.cnblogs.com/w ...
- 【nynu】 妹妹的工资怎么算(二分)
题目链接:http://47.93.252.151/problem.php?id=1148 题目描述 <我的妹妹哪有这么可爱!>中的女主叫做高坂桐乃,高坂家的幺女,外表出众.成绩优秀.运动 ...
- hdu 5802 Windows 10 (dfs)
Windows 10 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- mac下mysql 1045 (28000): Access denied for user 'root'@'localhost' (using password:
新入了mac pro,安装好mysql后,用终端进入mysql遇到个问题: 1045 (28000): Access denied for user 'root'@'localhost' (using ...