views.py
from django.contrib.auth.hashers import make_password, check_password
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from user.forms import UserRegisterForm, UserLoginForm
from user.models import User
def register(request):
if request.method == 'GET':
return render(request, 'register.html')
if request.method == 'POST':
# 使用表单做验证
form = UserRegisterForm(request.POST)
if form.is_valid():
# 字段验证成功,注册用户名不存在于数据库,密码和确认密码是一致的
username = form.cleaned_data['user_name']
password = form.cleaned_data['pwd']
email = form.cleaned_data['email']
new_password = make_password(password)
User.objects.create(username=username, password=new_password, email=email)
return HttpResponseRedirect(reverse('user:login'))
else:
# 字段验证不成功,将验证失败的信息返回给页面
errors = form.errors
return render(request, 'register.html', {'errors': errors})
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
if request.method == 'POST':
# 使用表单验证
form = UserLoginForm(request.POST)
if form.is_valid():
# 验证字段成功,验证了登录用户名已存在于数据库
username = form.cleaned_data['username']
pwd = form.cleaned_data['pwd']
user = User.objects.filter(username=username).first()
if user and check_password(pwd, user.password):
# 校验密码是否一致
# 校验成功
request.session['user_id'] = user.id
return HttpResponseRedirect(reverse('goods:index'))
else:
err_pwd = '账号或密码错误'
return render(request, 'login.html', {'err_pwd': err_pwd})
else:
errors = form.errors
return render(request, 'login.html', {'errors': errors})
forms.py
from django import forms
from user.models import User
class UserRegisterForm(forms.Form):
user_name = forms.CharField(max_length=20,
min_length=5,
required=True,
error_messages={
'required': '用户名必填',
'max_length': '用户名不能超过20个字符',
'min_length': '用户名不能少于5个字符',
})
pwd = forms.CharField(max_length=20,
min_length=8,
required=True,
error_messages={
'required': '密码必填',
'max_length': '密码不能超过20个字符',
'min_length': '密码不能少于8个字符',
})
cpwd = forms.CharField(max_length=20,
min_length=8,
required=True,
error_messages={
'required': '确认密码必填',
'max_length': '确认密码不能超过20个字符',
'min_length': '确认密码不能少于8个字符',
})
email = forms.CharField(required=True,
error_messages={
'required': '邮箱必填'
})
# 验证时自动调用
def clean(self):
# 校验用户名是否已存在于数据库
user = User.objects.filter(username=self.cleaned_data.get('user_name')).first()
if user:
# 用户已存在于数据库,抛出异常
raise forms.ValidationError({'user_name': '该用户已注册,请去登录'})
# 校验密码是否相等
pwd = self.cleaned_data.get('pwd')
cpwd = self.cleaned_data.get('cpwd')
if pwd != cpwd:
raise forms.ValidationError({'pwd': '两次密码不一致'})
return self.cleaned_data
class UserLoginForm(forms.Form):
username = forms.CharField(required=True,
error_messages={
'required': '用户名必填'
})
pwd = forms.CharField(required=True,
error_messages={
'required': '密码必填'
})
#
# def clean(self):
# # 验证登录的账号是否已经被注册过,注册过才能登录
# username = self.cleaned_data.get('username')
# user = User.objects.filter(username=username).first()
# if not user:
# raise forms.ValidationError({'username': '账号或者密码错误'})
#
# return self.cleaned_data







网友评论