30Django实战第30天:修改邮箱和用户信息

Posted 何波安的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了30Django实战第30天:修改邮箱和用户信息相关的知识,希望对你有一定的参考价值。

修改个人邮箱需要完成两个接口,一个是获取验证码,一个是新的邮箱和验证码是否匹配

1、编辑users.views.py

class SendEmailCodeView(LoginRequiredMixin, View):
    def get(self, request):
        email = request.GET.get(\'email\', \'\')
        if UserProfile.objects.filter(email=email):
            return HttpResponse(\'{"email":"该邮箱已被注册"}\', content_type=\'application/json\')
        sendEmail(email, \'hmail\')
        return HttpResponse(\'{"status":"success"}\', content_type=\'application/json\')

2、编辑users.urls.py

from .views import SendEmailCodeView

urlpatterns = [
    ...
    url(r\'sendemail_code/$\', SendEmailCodeView.as_view(), name=\'sendemail_code\'),
]

3、编辑utils.email_send.py

from random import Random
from django.core.mail import send_mail
from users.models import  EmailVerifyRecord
from mxonline.settings import EMAIL_FROM


def random_str(randomlenght=8):
    str = \'\'
    chars = \'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789\'
    length = len(chars) - 1
    random = Random()
    for i in range(randomlenght):
        str += chars[random.randint(0, length)]
    return str


def sendEmail(email, send_type=\'register\'):
    email_record = EmailVerifyRecord()
    if send_type == \'hmail\':
        code = random_str(4)
    else:
        code = random_str(16)
    email_record.code = code
    email_record.email = email
    email_record.send_type = send_type
    email_record.save()

    if send_type == \'register\':
        email_title = \'慕学在线网激活链接\'
        email_body = \'请点击下面的链接激活你的账号:http://127.0.0.1:8000/active/{0}\'.format(code)

        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_status:
            pass

    elif send_type == \'forget\':
        email_title = \'慕学在线网重置密码连接\'
        email_body = \'请点击下面的链接重置你的密码:http://127.0.0.1:8000/reset/{0}\'.format(code)

        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_status:
            pass

    elif send_type == \'hmail\':
        email_title = \'慕学在线网修改邮箱\'
        email_body = \'您的邮箱验证为:{0}\'.format(code)
        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_status:
            pass

4、编辑usercenter-base.html

5、编辑deco-user.js

 现在输入新邮箱,点击获取验证码,邮箱就能收到邮件了

现在我们来完成另外一个接口,验证验证码

编辑users.views.py

class UpdateEmailView(LoginRequiredMixin, View):
    def post(self, request):
        email = request.POST.get(\'email\', \'\')
        code = request.POST.get(\'code\', \'\')

        existed_records = EmailVerifyRecord.objects.filter(email=email, code=code, send_type=\'hmail\')
        if existed_records:
            user = request.user
            user.email = email
            user.username = email
            user.save()
            return HttpResponse(\'{"status":"success"}\', content_type=\'application/json\')
        else:
            return HttpResponse(\'{"email":"验证码错误"}\', content_type=\'application/json\')

编辑users.urls.py

...
from .views import UpdateEmailView

urlpatterns = [
   ...
    url(r\'update_email/$\', UpdateEmailView.as_view(), name=\'update_email\'),
]

编辑 deco-user.js

 现在输入验证码,就可以完成邮箱修改了

 

最后我们来完成用户信息的提交

我们之前定义了UserInfoView使用了get方法来显示,现在我们可以定义post方法完成用户信息的提交

编辑users.forms.py对提交的数据进行验证

class UserInfoForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = [\'nick_name\', \'gender\', \'birthday\', \'address\', \'mobile\']
        # 因为头像、密码、邮箱是单独修改的,这里就不取出来

编辑users.view.py

...
from .forms import UserInfoForm

class UserInfoView(LoginRequiredMixin, View):
    def get(self, request):
        return render(request, \'usercenter-info.html\', {})

    def post(self, request):
        user_info_form = UserInfoForm(request.POST, instance=request.user)
        if user_info_form.is_valid():
            user_info_form.save()
            return HttpResponse(\'{"status":"success"}\', content_type=\'application/json\')
        else:
            return HttpResponse(json.dumps(user_info_form.errors), content_type=\'application/json\')  

编辑usercenter-info.html

编辑 deco-user.js

 

以上是关于30Django实战第30天:修改邮箱和用户信息的主要内容,如果未能解决你的问题,请参考以下文章

第30天SQL进阶-查询优化- performance_schema系列实战五:查看最近的事务执行信息(SQL 小虚竹)

29Django实战第29天:修改密码和头像

Exchange Server 2016管理系列课件30.查询邮箱的登录创建信息

django第13天(auth组件,forms组件)

28Django实战第28天:个人信息展示

30天Python入门到进阶——第3天:数据类型(Ⅱ)