django2实现邮件链接注册

一.前端页面及功能实现理解:
在这里插入图片描述
功能:点击提交注册后用户能接收到一个确认邮件,用户点击后注册成功并跳转到登陆页面

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值