models.py
1 from django.db import models 2 3 from django.contrib.auth.models import AbstractUser 4 5 6 class Userinfo(AbstractUser): 7 8 email = models.EmailField()
seetings.py
AUTH_USER_MODEL='app01.Userinfo'#自定义认证表:应用名.类名
views.py
1 from django.shortcuts import render, HttpResponse, redirect 2 from django import forms 3 from django.core.validators import RegexValidator 4 from django.core.exceptions import ValidationError 5 import re 6 from app01 import models 7 from django.http import JsonResponse 8 from django.urls import reverse 9 from django.contrib import auth 10 11 # Create your views here. 12 13 def name_valid(value): 14 name_re = re.compile(r'^[d]+') 15 ret = name_re.match(value) 16 if ret: 17 raise ValidationError('用户名不能以数字开头!') 18 19 class RegisterForm(forms.Form): 20 name = forms.CharField( 21 required=True, 22 label='用户名:', 23 min_length=6, 24 max_length=32, 25 help_text='只能有字母数字下划线组成,且不能以数字开头,长度6到32位!', 26 # initial='admin123_', 27 error_messages={ 28 'required': '用户名不能为空!', 29 'min_length': '长度不能少于6位!', 30 'max_length': '长度不能超过32位!', 31 }, 32 validators=[RegexValidator(r'^[a-zA-Z0-9_]+$', '用户名只能包含字母数字下划线!'), name_valid], 33 ) 34 password = forms.CharField( 35 required=True, 36 label='密码:', 37 min_length=6, 38 max_length=32, 39 help_text='长度6到32位!', 40 initial='', 41 error_messages={ 42 'required': '密码不能为空!', 43 'min_length': '长度不能少于6位!', 44 'max_length': '长度不能超过32位!', 45 }, 46 widget=forms.PasswordInput(render_value=True), 47 ) 48 r_password = forms.CharField( 49 required=True, 50 label='确认密码:', 51 min_length=6, 52 max_length=32, 53 help_text='长度6到32位!', 54 initial='', 55 error_messages={ 56 'required': '密码不能为空!', 57 'min_length': '长度不能少于6位!', 58 'max_length': '长度不能超过32位!', 59 }, 60 widget=forms.PasswordInput(render_value=True), 61 ) 62 email = forms.EmailField( 63 required=True, 64 label='邮箱', 65 error_messages={ 66 'required': '邮箱不能为空!', 67 } 68 ) 69 70 def __init__(self, *args, **kwargs): 71 super(RegisterForm, self).__init__(*args, **kwargs) 72 for field in self.fields: 73 self.fields[field].widget.attrs.update({'class': 'form-control'}) 74 75 def clean_name(self): 76 pass 77 return self.cleaned_data.get('name') 78 79 def clean_password(self): 80 pass 81 return self.cleaned_data.get('password') 82 83 def clean_r_password(self): 84 pass 85 return self.cleaned_data.get('r_password') 86 87 def clean_email(self): 88 pass 89 return self.cleaned_data.get('email') 90 91 def clean(self): 92 password = self.cleaned_data.get('password') 93 r_password = self.cleaned_data.get('r_password') 94 if password != r_password: 95 self.add_error('r_password', '两次密码不一致!') 96 raise ValidationError('两次密码不一致!') 97 else: 98 return self.cleaned_data 99 100 101 # 注册 102 def register(request): 103 if request.method == 'GET': 104 register_obj = RegisterForm() 105 return render(request, 'register.html', {'register_obj': register_obj}) 106 elif request.method == 'POST': 107 data = request.POST 108 # print(data) 109 register_obj = RegisterForm(data) 110 if register_obj.is_valid(): 111 user_obj = register_obj.cleaned_data 112 print(user_obj) 113 username = user_obj.get('name') 114 password = user_obj.get('password') 115 email = user_obj.get('email') 116 117 if not models.Userinfo.objects.filter(username=username).exists(): 118 new_obj = models.Userinfo.objects.create_user(username=username, password=password, email=email) 119 print(f'新用户{username}注册成功!') 120 return redirect('login') 121 else: 122 register_obj.add_error('name', '用户名已存在!') 123 return render(request, 'register.html', {'register_obj': register_obj}) 124 else: 125 return render(request, 'register.html', {'register_obj': register_obj}) 126 # 登录 127 def login(request): 128 if request.method == 'GET': 129 return render(request, 'login.html') 130 elif request.method == 'POST': 131 # print(request.POST) 132 username = request.POST.get('username') 133 password = request.POST.get('password') 134 135 user_obj = auth.authenticate(username=username, password=password) 136 print(user_obj) 137 if user_obj: 138 auth.login(request, user_obj) 139 return JsonResponse({'status': 1, 'url': reverse('index')}) 140 else: 141 return JsonResponse({'status': 0, 'url': ''}) 142 143 #访问认证 144 def index(request): 145 if request.user.is_authenticated: 146 print(request.user) 147 if request.method == 'GET': 148 return render(request, 'index.html') 149 else: 150 return redirect('login') 151 152 #注销 153 def logout(request): 154 auth.logout(request) 155 return redirect('login') 156 157 #修改密码 158 def reset_psd(request): 159 if request.user.is_authenticated: 160 if request.method == 'GET': 161 return render(request, 'reset_psd.html') 162 elif request.method == 'POST': 163 old_password = request.POST.get('old_password') 164 new_password = request.POST.get('new_password') 165 r_new_password = request.POST.get('r_new_password') 166 # ret=request.user.check_password(old_password) 167 # print(ret) 168 if request.user.check_password(old_password): 169 if new_password == r_new_password: 170 request.user.set_password(new_password) 171 request.user.save() 172 return JsonResponse({'status': True, 'info': '操作成功!', 'url': reverse('index')}) 173 else: 174 return JsonResponse({'status': False, 'info': '两次新密码不一致!', 'url': ''}) 175 else: 176 return JsonResponse({'status': False, 'info': '操作失败:原密码输入有误!', 'url': ''}) 177 return JsonResponse({'status': False, 'info': '操作失败!', 'url': ''}) 178 179 else: 180 return redirect('login')
urls.py
1 from django.conf.urls import url 2 from django.contrib import admin 3 from app01 import views 4 5 urlpatterns = [ 6 url(r'^admin/', admin.site.urls), 7 url(r'^register/', views.register, name='register'), 8 url(r'^login/', views.login, name='login'), 9 url(r'^index/', views.index, name='index'), 10 url(r'^logout/', views.logout, name='logout'), 11 url(r'^reset_psd/', views.reset_psd, name='reset_psd'), 12 13 ] 14
templates
register.html
1 {% load static %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> 7 <title>用户注册</title> 8 </head> 9 <body style="background-image: url('{% static 'images/register_bg.gif' %}');background-size: cover"> 10 <div class="container"> 11 <div class="row"> 12 <div class="col-xs-6 col-xs-offset-3" style="margin-top: 12%;"> 13 <div class="container-fluid" style="background-color: rgba(255,255,255,0.2);border-radius: 5%"> 14 <div class="row"> 15 <h2 class="text-left col-xs-8 text-primary">新用户注册:</h2> 16 </div> 17 <div class="row" > 18 <form action="{% url 'register' %}" method="post" novalidate class="form-horizontal"> 19 {% csrf_token %} 20 {% for field in register_obj %} 21 <div class="form-group" > 22 <label for="{{ field.id_for_label }}" 23 class="col-xs-3 control-label" >{{ field.label }}</label> 24 <div class="col-xs-7"> 25 {{ field }} 26 <div style="height: 10px;" class="text-danger">{{ field.errors.0 }}</div> 27 </div> 28 </div> 29 {% endfor %} 30 <div class="form-group"> 31 <div class="col-sm-7 col-xs-offset-3"> 32 <span class="col-xs-10 text-success text-center" 33 style="line-height: 200%">已有账号,请<a href="{% url 'login' %}">登录</a>!</span> 34 <input type="submit" class="btn btn-success btn-sm col-xs-2 pull-right"> 35 </div> 36 </div> 37 </form> 38 </div> 39 </div> 40 </div> 41 </div> 42 </div> 43 </body> 44 <script src="{% static 'jquery-3.4.1.js' %}"></script> 45 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script> 46 </html>
login.html
1 {% load static %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> 7 <title>用户登录</title> 8 </head> 9 <body style="background-image: url('{% static "images/login_bg.jpg" %}');background-size: cover"> 10 <div> 11 <div class="container"> 12 <div class="row"> 13 <div class='col-xs-4 col-xs-offset-4'> 14 <div class="row" style="margin-top: 50%;background-color: rgba(255,255,255,0.2 );border-radius: 3%"> 15 <div class="row c1"> 16 <h2 class=" col-xs-6 text-primary" style="margin-bottom: 30px">用户登录</h2> 17 </div> 18 <div class="row"> 19 <div class="form-group" style="height: 60px;"> 20 <label for="username" class="col-xs-3 control-label text-right">用户名:</label> 21 <div class="col-xs-8"> 22 <input type="text" class="form-control" id="username"> 23 <div class="text-danger"></div> 24 </div> 25 </div> 26 <div class="form-group" style="height: 60px;"> 27 <label for="password" class="col-xs-3 control-label text-right">密码:</label> 28 <div class="col-xs-8"> 29 <input type="password" class="form-control" id="password"> 30 <div class="text-danger"></div> 31 </div> 32 </div> 33 <div class="form-group" style="height: 60px;"> 34 {% csrf_token %} 35 <div class="col-xs-8 col-xs-offset-3"> 36 <a href="{% url 'register' %}"> 37 <button class="btn btn-primary col-xs-offset-2" id="register">注册</button> 38 </a> 39 <button class="btn btn-success col-xs-offset-2" id="submit">登录</button> 40 <div class=" text-danger"></div> 41 </div> 42 </div> 43 </div> 44 </div> 45 </div> 46 </div> 47 </div> 48 </div> 49 50 </div> 51 </div> 52 </body> 53 <script src="{% static 'jquery-3.4.1.js' %}"></script> 54 <script src="{% static 'jquery-cookie-1.4.1.js' %}"></script> 55 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script> 56 <script> 57 $(function () { 58 $('#username').blur(function () { 59 if(username !== ''){$('#username').next().text('');} 60 }); 61 $('#password').blur(function () { 62 if(username !== ''){$('#password').next().text('');} 63 }); 64 $('#username').focus(function () { 65 if(username !== ''){$('#submit').next().text('');} 66 }); 67 $('#password').focus(function () { 68 if(username !== ''){$('#submit').next().text('');} 69 }); 70 71 72 $('#submit').click(function () { 73 74 var username = $('#username').val().trim(); 75 var password = $('#password').val().trim(); 76 77 78 if (username === '' || password === '') { 79 if (username === '') { 80 $('#username').next().text('用户名不能为空!'); 81 } 82 ; 83 if (password === '') { 84 $('#password').next().text('密码不能为空!') 85 } 86 ; 87 88 } else { 89 $.ajax({ 90 url: '{% url 'login' %}', 91 type: 'POST', 92 headers: {'X-CSRFToken': $.cookie('csrftoken')}, 93 data: { 94 'username': username, 95 'password': password, 96 97 }, 98 success: function (request) { 99 console.log(request); 100 if (request.status === 1) { 101 location.href = request.url; 102 } else { 103 $('#submit').next().text('账号或密码有误!'); 104 } 105 } 106 107 }) 108 } 109 110 }) 111 }) 112 </script> 113 </html> 114
index.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>首页</title> 6 </head> 7 <body> 8 <h1>index</h1> 9 <a href="{% url 'logout' %}"><h6>注销</h6></a> 10 <a href="{% url 'reset_psd' %}">修改密码</a> 11 </body> 12 </html>
reset_psd.html
1 {% load static %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> 7 <title>修改密码</title> 8 </head> 9 <body> 10 <div><h3>当前用户:{{ username }}</h3> 11 <p>请输入原密码:<input type="password" id="old_password"></p> 12 <P>请输入新密码:<input type="password" id="new_password"></P> 13 <p>请确认新密码:<input type="password" id="r_new_password"></p> 14 {% csrf_token %} 15 <p><button class="btn btn-success" id="submit">保存</button></p> 16 </form> 17 </div> 18 </body> 19 <script src="{% static 'jquery-3.4.1.js' %}"></script> 20 <script src="{% static 'jquery-cookie-1.4.1.js' %}"></script> 21 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script> 22 <script> 23 $(function () { 24 $('#submit').click(function () { 25 var old_password=$('#old_password').val().trim(); 26 var new_password=$('#new_password').val().trim(); 27 var r_new_password=$('#r_new_password').val().trim(); 28 29 if(old_password===''||new_password==='' || r_new_password===''){ 30 alert('不允许有空!'); 31 return false 32 }; 33 34 if(new_password!==r_new_password){ 35 alert('两次输入的新密码不一致,请重新确认输入!'); 36 return false 37 }; 38 $.ajax({ 39 url:'{% url "reset_psd" %}', 40 type:'post', 41 headers:{'X-CSRFToken':$.cookie('csrftoken')}, 42 data:{ 43 old_password:old_password, 44 new_password:new_password, 45 r_new_password:r_new_password, 46 }, 47 success:function (response) { 48 if(response.status===true){ 49 alert(response.info); 50 location.href=response.url; 51 } 52 else { 53 alert(response.info) 54 } 55 } 56 } 57 ) 58 }) 59 }) 60 </script> 61 </html>