当前位置: 首页 > news >正文

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

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-SHA256user = 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>
http://www.xdnf.cn/news/1152307.html

相关文章:

  • [每日随题11] 贪心 - 数学 - 区间DP
  • 让Logo/文字“自己画自己”!✨
  • Linux某个进程CPU占用率高原因定位手段
  • 从零手写红黑树(C++实现详解)
  • 142. 环形链表 II
  • FPGA自学——整体设计思路
  • Python Pandas读取Excel表格中数据并根据时间字段筛选数据
  • 使用 validation 框架生成一个校验参数是否在枚举内的校验器
  • 结合python面向对象编程,阐述面向对象三大特征
  • 【RK3576】【Android14】调试方法
  • 【理财】为什么要进行资金预留
  • QT动态加载动态库 QLibrary
  • 基于dcmtk的dicom工具 第六章 StoreSCU 图像发送
  • C语言:20250719笔记
  • docker|Linux|以centos基础镜像为基础制作nmap专用镜像(镜像瘦身计划)
  • 物联网系统中-告警配置功能的定义
  • MyBatis动态SQL全解析:五大核心标签实战指南
  • 加线机 和 胶带机
  • MyBatis之缓存机制详解
  • Go-Redis × RediSearch 全流程实践
  • #Datawhale组队学习#7月-强化学习Task2
  • 板子 5.29--7.19
  • Git仓库使用
  • Python关于numpy的基础知识
  • 若依部署项目到服务器
  • 深入排查:编译环境(JDK)与运行环境(JRE/JDK)不一致时的常见 Java 错误及解决方案
  • 【Linux】如何理解 “一切皆文件”
  • 黑马点评系列问题之p70postman报错“服务器异常”
  • LeetCode中等题--167.两数之和II-输入有序数组
  • Java File 类详解:从基础操作到实战应用,掌握文件与目录处理全貌