Django母婴商城项目实践(十一)- 用户信息模块之用户登录注册

发布于:2025-07-24 ⋅ 阅读:(16) ⋅ 点赞:(0)

11 用户信息模块

1、背景

  • 项目babys的用户信息模块分为:用户账户登录页面 和 个人中心页面,用户登录和注册在用一个页面实现,如果用户不存在,则执行注册操作,反之则执行登录操作;个人中心页面显示用户的基本信息和订单信息,而且订单信息需要设置分页展示。

2、内置User实现登录注册

  • 由于Django内置了用户管理功能,即Auth认证系统,而且具有灵活的扩展性,因此可以满足多方面的开发需求。创建项目时,Django已默认使用内置的 Auth认证系统,在settings.py 的 INSTALLED_APPS、 MIDDLEWARE 和 AUTH_PASSWORD_VALIDATORS 中都能看到相关的配置信息。

  • Django 的Auth 认证系统已内置模型 User,它对应数据表 auth_user,该模型一共定义了11个字段:

    以下是 Django 内置模型 User 的字段及其说明的表格整理:

    字段名 类型 描述
    username CharField 用户名,唯一标识用户,默认最大长度为150。
    password CharField 用户的密码,Django 会以哈希值形式存储密码。
    email EmailField 用户的电子邮件地址。
    first_name CharField 用户的名字。
    last_name CharField 用户的姓氏。
    is_staff BooleanField 标识用户是否可以访问管理后台。
    is_active BooleanField 标识用户是否处于激活状态,默认为 True
    is_superuser BooleanField 标识用户是否是超级用户,拥有所有权限。
    last_login DateTimeField 记录用户最后一次登录时间。
    date_joined DateTimeField 记录用户注册的时间,默认为用户创建时的时间。
    groups ManyToManyField 关联 Group 模型,用于分配用户到不同的用户组。
    user_permissions ManyToManyField 关联 Permission 模型,用于分配用户的特定权限。

    注意User 模型默认使用 AbstractUser 实现,如果需要自定义用户模型,可以通过继承 AbstractUserAbstractBaseUser 来实现。


  • 用户登录注册页面包含:登录注册表单。登录与注册表单共用一个页面表单,如果用户账号已存在,则对用户账号和密码进行验证并登录,如果用户不存在,则对当前的账号和密码进行注册处理。
    在这里插入图片描述

  • 项目babys 的用户注册和登录在项目应用 shopper 中已定义了路由 login,该路由对应的视图函数为 loginView:

from django.urls import path
from .views import *

urlpatterns = [
    path('login.html', loginView, name='login'),    # 用于登录与注册页
]

  • 在项目应用 shopper 的 views.py 中编写视图函数 loginView 的业务逻辑:
from django.contrib.auth import authenticate, login
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.shortcuts import render, redirect
from django.urls import reverse
from .models import *

def loginView(request):
    title = '用户登录'

    '''
    # 方式1:常规方式
    # get请求:响应登录页面
    if request.method == "GET":
        return render(request, 'login.html', locals())

    # post请求:处理登录请求(获取登录/注册参数)
    elif request.method == "POST":
        # 1 获取POST请求提交的用户名与密码
        uname = request.POST.get("username", "")
        upwd = request.POST.get("password", "")

        # 2 用户名存在则表示登录操作,否则为注册操作
        # user = User.objects.filter(username=uname)
        # if user:    # 登录
        if User.objects.filter(username=uname):  # 登录
            # 验证用户名与密码是否正确(密码加密)
            # user.username == uname and user.password == upwd
            # user.username == uname and user.check_password(upwd)

            # 验证用户名与密码是否正确:特有的密码加密方式
            user = authenticate(username=uname, password=upwd)
            print("user: ", user)
            # 验证通过,跳转到首页
            if user:
                login(request, user)  # 登录的逻辑
                return redirect(reverse("index:index"))
        else:  # 注册
            state = "注册成功"
            # 将注册信息保存到数据库 auth_user 表中
            userDict = {"username": uname, 'password': upwd, "is_active": 1, 'is_staff': 1}
            user = User.objects.create_user(**userDict)
            user.save()
            return render(request, 'login.html', locals())
    '''
    
    # 方式2:代码优化
    # post请求:处理登录请求(获取登录/注册参数)
    if request.method == "POST":
        # 1 获取POST请求提交的用户名与密码
        uname = request.POST.get("username", "")
        upwd = request.POST.get("password", "")

        # 2 用户名存在则表示登录操作,否则为注册操作
        if User.objects.filter(username=uname):  # 登录
            # 验证用户名与密码是否正确:特有的密码加密方式: pdkdf2-SHA256
            user = authenticate(username=uname, password=upwd)

            # 验证通过,跳转到首页
            if user:
                login(request, user)  # 登录的逻辑
                return redirect(reverse("index:index"))  # 重定向
        else:  # 注册
            state = "注册成功"
            # 将注册信息保存到数据库 auth_user 表中
            userDict = {
   
   "username": uname, 'password': upwd, "is_active": 1, 'is_staff': 1}
            user = User.objects.create_user(**userDict)
            user.save()
            return render(request, 'login.html', locals())

    return render(request, 'login.html', locals())

3、Login登录模板渲染

# file: templates/login.html

<!DOCTYPE html>
<html lang="en">
{% load static %}
<head>
    <meta charset="UTF-8">
    <title>{
  
  { title }}</title>
    <link rel="stylesheet" href="{% static 'css/login.css' %}">
    <script src="{% static 'js/jquery-1.10.2.js' %}"></script>
</head>
<body>
<div class="login-bg">
    <div class="form-box">
        <form action="{% url 'shopper:login' %}" method="post">
            {% csrf_token %}
            <p>手机号登录注册</p>
            <!-- 自定义提示框 -->
            <div id="error-message"></div>
            <div class="login-phone-box">
                <svg t="1752367456450" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5049" width="26" height="26"><path d="M826.090023 861.946161c0 53.442166-43.324738 96.764857-96.764857 96.764857L294.670741 958.711018c-53.439096 0-96.761788-43.322691-96.761788-96.764857L197.908954 162.052816c0-53.439096 43.322691-96.762811 96.761788-96.762811l434.655448 0c53.44012 0 96.764857 43.323715 96.764857 96.762811L826.091046 861.946161 826.090023 861.946161zM770.25025 162.052816c0-22.602787-18.321274-40.925085-40.924061-40.925085L294.670741 121.127731c-22.601764 0-40.924061 18.322297-40.924061 40.925085l0 699.893344c0 22.602787 18.322297 40.924061 40.924061 40.924061l434.655448 0c22.602787 0 40.924061-18.321274 40.924061-40.924061L770.25025 162.052816 770.25025 162.052816z" fill="#cdcdcd" p-id="5050"></path><path d="M797.529547 777.23278 225.18825 777.23278c-7.716752 0-13.959943-6.244214-13.959943-13.95892 0-7.716752 6.244214-13.960966 13.959943-13.960966l572.341297 0c7.701402 0 13.960966 6.244214 13.960966 13.960966C811.48949 770.989589 805.231973 777.23278 797.529547 777.23278z" fill="#cdcdcd" p-id="5051"></path><path d="M797.529547 218.845287 225.18825 218.845287c-7.716752 0-13.959943-6.243191-13.959943-13.95892 0-7.716752 6.244214-13.960966 13.959943-13.960966l572.341297 0c7.701402 0 13.960966 6.244214 13.960966 13.960966C811.48949 212.602096 805.231973 218.845287 797.529547 218.845287z" fill="#cdcdcd" p-id="5052"></path><path d="M546.898323 836.56305c0 13.495362-10.946306 24.429389-24.429389 24.429389l-6.978948 0c-13.483082 0-24.430412-10.93505-24.430412-24.429389l0-6.980995c0-13.495362 10.94733-24.429389 24.430412-24.429389l6.978948 0c13.483082 0 24.429389 10.937097 24.429389 24.429389L546.898323 836.56305z" fill="#cdcdcd" p-id="5053"></path>

网站公告

今日签到

点亮在社区的每一天
去签到