一、注冊模塊
1.創(chuàng)建注冊驗證表單
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': '郵箱必填'
})
# 驗證時目派,會自動調(diào)用
def clean(self):
# 校驗用戶名是否已存在于數(shù)據(jù)庫
user =User.objects.filter(username=self.cleaned_data.get('user_name')).first()
if user:
# 用戶已存在于數(shù)據(jù)庫,拋出異常
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
2.注冊功能
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():
# 字段驗證成功,注冊用戶名不存在于數(shù)據(jù)庫,密碼和確認密碼是一致的
username = form.cleaned_data['user_name']
password = form.cleaned_data['pwd']
email = form.cleaned_data['email']
# 密碼加密:make_password()
# from django.contrib.auth.hashers import make_password
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})
二、登錄模塊
1.創(chuàng)建登錄驗證表單
class UserLoginForm(forms.Form):
username = forms.CharField(required=True,
error_messages={
'required': '用戶名必填',
})
pwd = forms.CharField(required=True,
error_messages={
'required': '密碼必填',
})
2.登錄功能
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 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:
# 校驗密碼是否一致
if check_password(pwd, user.password):
# 校驗成功
request.session['user_id'] = user.id
return HttpResponseRedirect(reverse('goods:index'))
else:
# 密碼錯誤
error_pwd = '賬號或密碼錯誤'
return render(request, 'login.html', {'error_pwd': error_pwd})
else:
error_pwd = '賬號或密碼錯誤'
return render(request, 'login.html', {'error_pwd': error_pwd})
else:
errors = form.errors
return render(request, 'login.html', {'errors': errors})
def user_center_info(request):
if request.method == 'GET':
return render(request, 'user_center_info.html')
def user_center_order(request):
if request.method == 'GET':
return render(request, 'user_center_order.html')
def user_center_site(request):
if request.method == 'GET':
return render(request, 'user_center_site.html')
三匆光、中間件校驗登錄狀態(tài)
1.定義校驗中間件
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin
from user.models import User
class LoginStatusMiddleware(MiddlewareMixin):
def process_request(self, request):
if request.path in [reverse('user:register'), reverse('user:login')]:
return None
user_id = request.session.get('user_id')
if user_id:
user = User.objects.get(pk=user_id)
request.user = user
return None
else:
return HttpResponseRedirect(reverse('user:login'))
def process_response(self, request, response):
return response
2.主頁面模塊
from django.shortcuts import render
from goods.models import Goods, GoodsCategory
from user.models import User
def index(request):
if request.method == 'GET':
data = {}
# 循環(huán)商品分類
for cate in GoodsCategory.CATEGORY_TYPE:
# 獲取當前分類下的前四個商品信息
goods = Goods.objects.filter(category_id=cate[0])[0:4]
# 組裝成鍵值對套像,key為商品分類的名稱,value為當前分類的商品信息
data[cate[1]] = goods
return render(request, 'index.html', {'goods_category': data})