前端页面中的跳转链接可以写成 href="{% url 'index' %}" 格式,而不是 herf="index.html"
用户注册
- 注册的view
# _*_ coding: utf-8 _*_
from django.shortcuts import render
from django.views.generic.base import View
from django.contrib.auth.hashers import make_password
from users.forms import LoginForm, RegisterForm
from users.models import UserProfile
from utils.email_send import send_register_email
# 注册
class RegisterView(View):
def get(self, request):
register_form = RegisterForm()
return render(request, "register.html", {'register_form': register_form})
def post(self, request):
register_form = RegisterForm(request.POST)
if register_form.is_valid():
user_name = request.POST.get("email", "")
if UserProfile.objects.filter(email=user_name):
return render(request, "register.html", {"register_form": register_form, "msg": "用户邮箱已存在"})
pass_word = request.POST.get("password", "")
user_profile = UserProfile()
user_profile.username = user_name
user_profile.email = user_name
user_profile.is_active = False
user_profile.password = make_password(pass_word)
user_profile.save()
send_register_email(user_name, "register")
return render(request, "login.html")
else:
return render(request, "register.html", {"register_form": register_form})
- 注册的from
# _*_ coding: utf-8 _*_
from django import forms
from captcha.fields import CaptchaField
# 注册form
class RegisterForm(forms.Form):
email = forms.EmailField(required=True)
password = forms.CharField(required=True, min_length=5)
captcha = CaptchaField(error_messages={"invalid": u"验证码错误"})
- 用户数据表
# _*_ coding: utf-8 _*_
from __future__ import unicode_literals
from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
nike_name = models.CharField(max_length=10, verbose_name="昵称", default="")
birday = models.DateField(verbose_name="生日", null=True, blank=True)
gender = models.CharField(choices=(("male", u"男"), ("female", u"女")), default="male", max_length=6)
adress = models.CharField(max_length=100, default=u"", verbose_name=u"地址")
moblie = models.CharField(max_length=11, null=True, blank=True, verbose_name=u"手机")
image = models.ImageField(upload_to="upload/iamge/%Y/%m", default=u"image/defult.png", max_length=100)
class Meta:
verbose_name = "用户信息"
verbose_name_plural = verbose_name
def __unicode__(self):
return self.username
- 注册的url
url('^register/$', User_Views.RegisterView.as_view(), name="register"),
邮件相关
- 邮件发送
- 新建一个utils目录用来存放工具相关函数
- 在utils目录下新建email_send.py文件
# _*_ coding: utf-8 _*_
__author__ = 'daxiahy'
__date__ = '2019/1/3 18:04'
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(randomlength=8):
str = ''
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
length = len(chars) - 1
random = Random()
for i in range(randomlength):
str+=chars[random.randint(0, length)]
return str
def send_register_email(email, send_type="register"):
email_record = EmailVerifyRecord()
if send_type == "update_email":
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()
email_title = ""
email_body = ""
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 == "update_email":
email_title = "慕学在线邮箱修改验证码"
email_body = "你的邮箱验证码为: {0}".format(code)
send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
if send_status:
pass
邮件在setting中的配置
EMAIL_HOST = "smtp.mxhichina.com"
EMAIL_PORT = "25"
EMAIL_HOST_USER = "tarimbbs@tarimbbs.cn"
EMAIL_HOST_PASSWORD = ""
EMAIL_HOST_TLS = False
EMAIL_FROM = "tarimbbs@tarimbbs.cn"
EMAIL_HOST = "smtp.163.com"
EMAIL_PORT = "25"
EMAIL_HOST_USER = "passion2048@163.com"
EMAIL_HOST_PASSWORD = ""
EMAIL_HOST_TLS = False
EMAIL_FROM = "passion2048@163.com"
- 前端页面html
<!DOCTYPE html>
{% load staticfiles %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>register</title>
</head>
<body>
<div class="fl form-box">
<div class="tab">
<!--<h2 class="active">手机注册</h2>-->
<h2>邮箱注册</h2>
</div>
<div class="tab-form">
<form id="email_register_form" method="post" action="{% url 'register' %}" autocomplete="off">
{% csrf_token %}
<div class="form-group marb20 {% if register_form.errors.email %}errorput{% endif %}">
<label>邮 箱</label>
<input type="text" id="id_email" name="email" value="{{ register_form.email.value|default_if_none:'' }}" placeholder="请输入您的邮箱地址" />
</div>
<div class="form-group marb8 {% if register_form.errors.password %}errorput{% endif %}">
<label>密 码</label>
<input type="password" id="id_password" name="password" value="{{ register_form.password.value|default_if_none:'' }}" placeholder="请输入6-20位非中文字符密码" />
</div>
<div class="form-group marb8 captcha1 {% if register_form.errors.captcha %}errorput{% endif %}">
<label>验 证 码</label>
{{ register_form.captcha }}
</div>
<div class="error btns" id="jsEmailTips">{% for key, error in register_form.errors.items %}{{ error }}{% endfor %}
{{ msg }}</div>
<div class="auto-box marb8">
</div>
<input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注册并登录" />
{% csrf_token %}
</form>
</div>
<p class="form-p">已有账号?<a href="{% url 'login' %}">[立即登录]</a></p>
</div>
<script src="{% static 'js/jquery-3.3.1.min.js' %}"></script>
<script>
$('.captcha').click(function () {
$.getJSON("/captcha/refresh/", function (result) {
$('.captcha').attr('src', result['image_url']);
$('#id_captcha_0').val(result['key'])
});
});
</script>
</body>
</html>
- 用户激活
# 激活链接
class ActiveUserView(View):
def get(self, request, active_code):
all_records = EmailVerifyRecord.objects.filter(code=active_code)
if all_records:
for record in all_records:
email = record.email
user = UserProfile.objects.get(email=email)
user.is_active = True
user.save()
else:
return render(request,"active_fail.html")
return render(request, "login.html")
def post(self, request):
return render(request, "login.html")
emile的model
class EmailVerifyRecord(models.Model):
code = models.CharField(max_length=20, verbose_name=u"验证码")
email = models.EmailField(max_length=50, verbose_name=u"邮箱")
send_type = models.CharField(max_length=20, verbose_name=u"类型", choices=(("register", u"注册"), ("forget", u"找回密码")))
# 需要把datetime.now()的括号去掉才会在实例化类时获取时间,而不是程序编译时
send_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间")
class Meta:
verbose_name = u"邮箱验证码"
verbose_name_plural = verbose_name
def __unicode__(self):
return '{0}({1})'.format(self.code, self.email)
url配置
url(r'^active/(?P<active_code>.*)/$', ActiveUserView.as_view(), name="user_active"),
#### 注:
前端静态目录可以写成 href="{% static 'css/login.css' %}" 格式,且要在html顶端写{% load staticfiles %}