一.前端页面及功能实现理解:
功能:点击提交注册后用户能接收到一个确认邮件,用户点击后注册成功并跳转到登陆页面
1.forms.py (form表单)
from django import forms
from captcha.fields import CaptchaField
from index.models import User
class RegisterForm(forms.Form):
'''
注册
'''
email = forms.EmailField(required=True,label='邮箱',widget=forms.TextInput(
attrs={"class": "form-control", "placeholder": "请输入邮箱账号", "value": ""}),
max_length=100, error_messages={"required": "邮箱不能为空","invalid": "" })
pwd = forms.CharField(required=True,label='密码',widget=forms.PasswordInput(
attrs={"class": "form-control", "placeholder": "请输入密码", "value": ""}),
min_length=8, max_length=50, error_messages={"required": "密码不能为空", "invalid": "密码不能少于8位", "lable": "密码" })
repwd = forms.CharField(required=True,label='确认密码',widget=forms.PasswordInput(
attrs={"class": "form-control", "placeholder": "请确认密码", "value": "", }),
min_length=8, max_length=50, error_messages={"required": "密码不能为空","invalid": "密码不能少于8位","lable": "确认密码"})
##邮箱验证码
# email_code=forms.CharField(required=True,label='邮箱验证码')
##验证码
captcha = CaptchaField(label='',error_messages={"invalid":'验证码错误'})
def clean(self):
# 用户名
try:
email = self.cleaned_data['email']
except Exception as e:
print('except: ' + str(e))
raise forms.ValidationError("邮箱格式错误")
# 登录验证(邮箱去重),查看邮箱是否存在
is_email_exist = User.objects.filter(email=email).exists()
#is_username_exist = User.objects.filter(username=username).exists()
if is_email_exist:
raise forms.ValidationError("该邮箱已被注册")
2.前端
<div>
<form action="{{ register }}" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="提交" />
</form>
</div>
二.建数据模型
##用户表
class User(models.Model):
##自增:主键字段将自动添加AutoField
# name=models.CharField(max_length=64)
##email必须唯一
# user_id=models.AutoField(primary_key=True,verbose_name='用户id')
email=models.EmailField(max_length=50,unique=True,verbose_name='邮箱')
##用make_passwd加密给长点
passwd=models.CharField(max_length=100,verbose_name='密码')
##是否激活
is_active=models.BooleanField(default=False)
phone=models.CharField(max_length=20,default='null')
headImg=models.ImageField(upload_to='img/headImg',verbose_name='用户头像')
name=models.CharField(max_length=50,verbose_name='用户名',default=email)
# ##性别
GENDER_CHOICES=(
(0,'null'),
(1,'Male'),
(2,'Female')
)
##choices该参数接收一个可迭代的列表或元组(基本单位为二元组)。如果指定了该参数,在实例化该模型时,该字段只能取选项列表中的值。
gender=models.IntegerField(choices=GENDER_CHOICES,default=0)
##邮箱验证码
class EmailRecord(models.Model):
code=models.CharField(max_length=20,verbose_name='验证码')
email=models.EmailField(max_length=50,verbose_name='邮箱')
##验证类型
send_type=models.CharField(verbose_name='验证码类型',max_length=10,
choices=(('register','注册'),('forget','找回密码')))
send_time=models.DateTimeField(verbose_name='发送时间',default=datetime.now)
class Meta:
verbose_name='邮箱验证'
verbose_name_plural=verbose_name
def __str__(self):
return self.code,self.email
注意:1.建好后记得迁移数据模型到数据库中(建主键和外键关联要想好了再建 后面不好改)
2.密码用了make_passwd函数加密所以给长点,不然不够用会报错
三.后端逻辑实现
from django.contrib.auth.hashers import make_password
from django.shortcuts import render
# Create your views here.
from index.forms import RegisterForm
from index.models import Photo, News, User, EmailRecord
from index.send import send_register_email
#用户注册
def register(request):
if request.method=='POST':
form=RegisterForm(request.POST)
if form.is_valid():##如果提交数据合法
##提取前端页面输入的数据
email=request.POST.get('email', "")
passwd=request.POST.get('pwd', "")
##实例化用户表
user_profile=User()
##赋值给数据模型
user_profile.email=email
user_profile.passwd=passwd
#这个数据库中默认的也是False所以也可以不用写
user_profile.is_active=False
##将传入的密码加密
user_profile.passwd=make_password(passwd)
##保存到数据库
user_profile.save()
#发送邮箱给用户(这个发送邮件上篇有)
send_register_email(email,"register")
else:
form=RegisterForm()
return render(request, 'register.html', {'form': form})
##邮箱激活
def ActiveUser(request,active_code):
##在数据库中查询用户访问的这个邮箱激活码
all_record=EmailRecord.objects.filter(code=active_code)
if all_record:
for cord in all_record:
##通过这个邮箱验证码找到EmailRecord的email
email=cord.email
##通过email这个找到User的email(因为先注册后邮箱验证,传的值是同一个email)
user=User.objects.get(email=email)
##将用户的状态改为激活状态
user.is_active=1
user.save()
return render(request,'login.html')
四.配置urls.py
##验证码模块
path('captcha/',include('captcha.urls')),
path('register/',views.register,name='register'),
##邮箱激活
path('active/<str:active_code>',views.ActiveUser,name='activeuser')
注意:captcha这个前端显示的验证码 要在settings配置app
五.实现过程:
点击提交后:1. register/ 处理:(1)保存数据到数据库(email,passwd)(2)给这个email发邮件链接地址(/active/code)
2.用户点击链接后 : (1)urls处理这个链接地址到对应的函数ActiveUser (2)通过这个链接地址后面的code找到email,并通过email激活User表中的用户状态
3.重定向到login.html
六:
注意:我们本地跑的所以还得在本地上输入该地址
然后就会跳转到login.html