【Django】网上蛋糕项目商城-注册,登录,修改用户信息,退出功能

news2024/9/21 2:45:52

概念

通过以上多篇文章的讲解,对该项目的功能已经实现了很多,本文将对该项目的用户注册,登录,修改用户信息,以及退出等功能的实现。

注册功能实现

点击head.html头部页面的注册按钮,触发超链接跳转至user_register.html页面,其页面代码如下

在urls.py文件中定义该请求地址

path('register/',views.register),

在views.py文件中创建处理该请求的函数

# 跳转至注册页面
def register(request):
    return render(request,"user_register.html",{"typeList": types})

其注册页面代码如下

<!DOCTYPE html>
<html>
<head>
	<title>用户注册</title>
    {% load static %}
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<link type="text/css" rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
	<link type="text/css" rel="stylesheet" href="{% static 'css/style.css' %}">
	<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
	<script type="text/javascript" src="{%  static 'js/bootstrap.min.js' %}"></script>
	<script type="text/javascript" src="{% static 'js/simpleCart.min.js' %}"></script>
</head>
<body>
	{% include "header.html" with flag=10 typeList=typeList %}
	<div class="account">
		<div class="container">
			<div class="register">
                {% if msg %}
                    <div class="alert alert-danger">{{ msg }}</div>
                {% endif %}
				<form action="/user_rigister/" method="post">
                    {% csrf_token %}
					<div class="register-top-grid">
						<h3>注册新用户</h3>
						<div class="input">
							<span>用户名 <label style="color:red;">*</label></span>
							<input type="text" name="username" placeholder="请输入用户名" required="required">
						</div>
						<div class="input">
							<span>邮箱 <label style="color:red;">*</label></span>
							<input type="text" name="email" placeholder="请输入邮箱" required="required">
						</div>
						<div class="input">
							<span>密码 <label style="color:red;">*</label></span>
							<input type="password" name="password" placeholder="请输入密码" required="required">
						</div>
						<div class="input">
							<span>收货人<label></label></span>
							<input type="text" name="name" placeholder="请输入收货人姓名">
						</div>
						<div class="input">
							<span>收货电话<label></label></span>
							<input type="text" name="phone" placeholder="请输入收货电话">
						</div>
						<div class="input">
							<span>收货地址<label></label></span>
							<input type="text" name="address" placeholder="请输入收货地址">
						</div>
						<div class="clearfix"> </div>
					</div>
					<div class="register-but text-center">
					   <input type="submit" value="提交">
					   <div class="clearfix"> </div>
					</div>
				</form>
				<div class="clearfix"> </div>
			</div>
	    </div>
	</div>
	{% include "footer.html" %}
</body>
</html>

用户填写注册信息后,点击提交按钮,将信息发送给后台服务器,在urls.py文件中定义请求地址

path('user_rigister/',views.user_rigister),

在views.py文件中创建处理该函数

# 处理注册请求
def user_rigister(request):
    # 用户名
    username=request.POST["username"]
    # 邮箱
    email=request.POST["email"]
    # 密码
    password=request.POST["password"]
    # 收货人
    name=request.POST["name"]
    # 收货电话
    phone=request.POST["phone"]
    # 收货地址
    address=request.POST["address"]
    # 判断用户名是否存在
    users=User.objects.filter(username=username)
    # 判断邮箱是否存在
    emails=User.objects.filter(email=email)
    if users or emails:
        msg="用户名或邮箱重复,请重新填写!"
        path="user_register.html"
    else:
        User.objects.create(username=username,email=email,password=password,name=name,phone=phone,address=address,isadmin=False,isvalidate=False)
        msg = "注册成功,请登录!"
        path = "user_login.html"
    return render(request,path,{"msg":msg,"typeList": types})

当注册成功,跳转至登录页面,页面代码如下,如果注册失败,则会重新刷新注册页面

<!DOCTYPE html>
<html>
<head>
	<title>用户登录</title>
    {% load static %}
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<link type="text/css" rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
	<link type="text/css" rel="stylesheet" href="{% static 'css/style.css' %}">
	<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
	<script type="text/javascript" src="{% static 'js/bootstrap.min.js' %}"></script>
	<script type="text/javascript" src="{% static 'js/simpleCart.min.js' %}"></script>
</head>
<body>
	{% include "header.html" with flag=9 typeList=typeList %}
	<div class="account">
		<div class="container">
			<div class="register">
                {% if msg %}
                    <div class="alert alert-success">{{ msg }}</div>
                {% endif %}
				{% if failMsg %}
                    <div class="alert alert-danger">{{ failMsg }}</div>
                {% endif %}
				<form action="/user_login" method="post">
                    {% csrf_token %}
					<div class="register-top-grid">
						<h3>用户登录</h3>
						<div class="input">
							<span>用户名/邮箱 <label style="color:red;">*</label></span>
							<input type="text" name="ue" placeholder="请输入用户名" required="required">
						</div>
						<div class="input">
							<span>密码 <label style="color:red;">*</label></span>
							<input type="password" name="password" placeholder="请输入密码" required="required">
						</div>

						<div class="clearfix"> </div>
					</div>
					<div class="register-but text-center">
						<input type="submit" value="提交">
						<div class="clearfix"> </div>
					</div>
				</form>
				<div class="clearfix"> </div>
			</div>
	    </div>
	</div>
	{% include "footer.html" %}
</body>
</html>

登录功能实现

当注册成功后,进入登录页面,界面如上图所示,也可以点击登录选项进入登录页面

在urls.py文件中定义该请求地址

path('login/',views.login),

在views文件中创建该函数

# 处理跳转登录页面的请求
def login(request):
    return render(request, "user_login.html", {"typeList": types})

当用户输入用户名和密码后,点击提交,将用户登录信息发送给后台服务器

在urls文件中定义请求地址

path('user_login/',views.user_login),

 在setting.py文件中,添加以下代码,使session在固定时间内失效

# 设置session过期时间为1小时(3600秒)
SESSION_COOKIE_AGE = 60

在views文件中创建函数处理该请求

# 处理登录的请求
def user_login(request):
    # 用户名/邮箱
    ue=request.POST["ue"]
    # 密码
    password=request.POST["password"]
    # 使用用户名和密码查询该用户信息
    users=User.objects.filter(username=ue,password=password)
    if not users:
        users=User.objects.filter(email=ue,password=password)
    # global user
    if users:
        request.session["isLogin"]=True
        u=users.values()[0]
        print(u)
        request.session["user"]=u
        failMsg = ""
        path="user_center.html"
    else:
        user=None
        request.session["user"] = user
        failMsg="用户名、邮箱或者密码错误,请重新登录!"
        path="user_login.html"
    print(users.values_list())
    return render(request,path,{"typeList": types,"failMsg":failMsg})

当登录成功后,跳转至个人中心页面,页面代码如下

<!DOCTYPE html>
<html>
<head>
	<title>个人中心</title>
    {% load static %}
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<link type="text/css" rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
	<link type="text/css" rel="stylesheet" href="{% static 'css/style.css' %}">
	<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
	<script type="text/javascript" src="{% static 'js/bootstrap.min.js' %}"></script>
	<script type="text/javascript" src="{% static 'js/simpleCart.min.js' %}"></script>
</head>
<body>
{% include "header.html" with flag=4 typeList=typeList user=user  %}
	{% if not user %}
	    <script>
        //当用户没有登录,直接进入个人中心时,强制跳转至未登录的首页页面
            location.href="/"
        </script>
	{% endif %}
	<!--account-->
	<div class="account">
		<div class="container">
			<div class="register">
                {% if msg %}
                    <div class="alert alert-success">{{ msg }}</div>
                {% endif %}
				{% if failMsg %}
                    <div class="alert alert-danger">{{ failMsg }}</div>
                {% endif %}
					<div class="register-top-grid">
						<h3>个人中心</h3>
						<form action="/user_changeaddress/" method="post">
                            {% csrf_token %}
						<!-- 收货信息 start -->
						<h4>收货信息</h4>
						<div class="input">
							<span>收货人<label></label></span>
							<input type="text" name="name" value="{{ request.session.user.name }}" placeholder="请输入收货">
						</div>
						<div class="input">
							<span>收货电话</span>
							<input type="text" name="phone" value="{{ request.session.user.phone }}" placeholder="请输入收货电话">
						</div>
						<div class="input">
							<span>收货地址</span>
							<input type="text" name="address" value="{{ request.session.user.address }}" placeholder="请输入收货地址">
						</div>
						<div class="register-but text-center">
						   <input type="submit" value="提交">
						</div>	
						<!-- 收货信息 end -->
						</form>
						<hr>
						<form action="/user_changepwd/" method="post">
                            {% csrf_token %}
						<h4>安全信息</h4>
						<div class="input">
							<span>原密码</span>
							<input type="text" name="password" placeholder="请输入原密码"> 
						</div>
						<div class="input">
							<span>新密码</span>
							<input type="text" name="newPassword" placeholder="请输入新密码"> 
						</div>
						<div class="clearfix"> </div>
						<div class="register-but text-center">
						   <input type="submit" value="提交">
						</div>	
						</form>
					</div>
				<div class="clearfix"> </div>
			</div>
	    </div>
	</div>
	{% include "footer.html" %}
</body>
</html>

修改用户信息功能

在header.html头部页面中,添加以下超链接

在urls.py文件中定义接收该请求的地址

path('user_center/',views.user_center),

在views.py文件中定义该函数处理请求

# 个人中心页面
def user_center(request):
    return render(request,"user_center.html",{"typeList": types})

1.修改个人收货地址 

该页面中,有两个表单,第一个表单用于修改用户个人信息,第二个表单用于修改密码。

在urls文件中添加接收请求地址

path('user_changeaddress/',views.user_changeaddress),

在views文件中定义函数处理该请求

# 修改个人收件信息
def user_changeaddress(request):
    name=request.POST["name"]
    phone=request.POST["phone"]
    address=request.POST["address"]
    user=request.session.get("user")
    print(user)
    u=User.objects.filter(id=user["id"])
    u.update(name=name,phone=phone,address=address)
    u = User.objects.filter(id=user["id"]).values()
    # 将更新后的数据同步session中
    request.session["user"]=u[0]
    msg="收件信息更新成功!"
    return render(request,"user_center.html",{"typeList": types,"msg":msg})

2.修改密码 

在urls文件中定义接收修改密码的请求  

path('user_changepwd/',views.user_changepwd),

在views文件中创建函数处理修改密码请求

# 修改密码
def user_changepwd(request):
    psd=request.POST["password"]
    newPsd=request.POST["newPassword"]
    user = request.session.get("user")
    print(user)
    key=""
    if psd == user["password"]:
        u = User.objects.filter(id=user["id"])
        u.update(password=newPsd)
        key="msg"
        msg="修改成功!"
        u = User.objects.filter(id=user["id"]).values()
        # 将更新后的数据同步session中
        request.session["user"] = u[0]
    else:
        key="failMsg"
        msg="修改失败,原密码不正确,你再想想!"

    return render(request, "user_center.html", {"typeList": types, key: msg})

退出功能实现

在header.html头部页面中,添加以下超链接

在urls.py文件中定义接收该请求的地址

path('user_logout/',views.user_logout),

在views.py文件中定义该函数处理请求

#退出登录
def user_logout(request):
    del request.session["isLogin"]
    del request.session["user"]
    return redirect(index)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8s集群初始化遇到的问题

kubectl describe pod coredns-545d6fc579-s9g5s -n kube-system 找到原因1&#xff1a;CoreDNS Pod 处于 Pending 状态的原因是集群中的节点都带有 node.kubernetes.io/not-ready 污点 journalctl -u kubelet -f 14:57:59.178592 3553 remote_image.go:114] "PullIma…

火车行驶动态特效404单页源码

源码介绍 火车行驶动态特效404单页源码,白云飘飘,小火车带着not page found行驶远方,适合做网站错误页,将下面的代码放到空白的html文件里面,鼠标双击即可查看效果,或者上传到服务器,设置好重定向即可 效果预览 完整代码 <!DOCTYPE html> <html><head…

【ROS2】高级:实现自定义内存分配器

目标&#xff1a;本教程将展示在编写 ROS 2 C 代码时如何使用自定义内存分配器。 教程级别&#xff1a;高级 时间&#xff1a;20 分钟 目录 背景 编写分配器编写一个示例主程序将分配器传递到进程内管道测试和验证代码 TLSF 分配器 本教程将教您如何为发布者和订阅者集成自定义…

【个人笔记】685. 冗余连接 II 的解释(并查集)

一棵树有n个点和n条边&#xff0c;返回一条能删除的边&#xff0c;使得剩下的图是有 n 个节点的有根树。 解释&#xff1a; 注意不冗余的有根树的特性&#xff01;**根节点入度为0&#xff0c;其余结点只有一个入度&#xff01;**所以冗余的两种情况如下&#xff1a; &#xff…

jmeter持续学习之---控制器

IF控制器 下面这种写法jmeter不推荐有性能的问题 jmeter推荐勾选上的这种写法 使用"Interpret Condition as Variable Expression"工具的性能要好一些 循环控制器 ForEach控制器 与用户定义的变量或者正则表达式提取器配合使用,循环读取。用户定义的变量或者正则…

彻底改变时尚:使用 GAN 实现 AI 的未来

彻底改变时尚&#xff1a;使用 GAN 实现 AI 的未来 一、介绍 想象一下&#xff0c;在这个世界里&#xff0c;时装设计师永远不会用完新想法&#xff0c;我们穿的每一件衣服都是一件艺术品。听起来很有趣&#xff0c;对吧&#xff1f;好吧&#xff0c;我们可以在通用对抗网络 &a…

路网双线合并单线——ArcGISpro 解决方法

路网双线合并成单线是一个在地图制作、交通规划以及GIS分析中常见的需求。双线路网定义&#xff1a;具有不同流向、不同平面结构的道路。此外&#xff0c;车道数较多的道路&#xff08;例如&#xff0c;双黄实线车道数大于4的道路&#xff09;也可以视为双线路网&#xff0c;本…

C++相关概念和易错语法(22)(final、纯虚函数、继承多态难点)

1.final final在继承和多态中都可以使用&#xff0c;在继承中是指不想将自己被继承&#xff0c;在多态中是指不想该函数被重写&#xff0c;比较简单&#xff0c;下面是一些使用例子。 2.纯虚函数 当我们需要抽象一个类的时候&#xff0c;我们就需要用到纯虚函数。所谓抽象的类…

深入理解I/O模型

目录 一、I/O 模型简介 二、I/O 模型 2.1 同步阻塞 I/O 2.2 同步非阻塞I/O 2.3 I/O多路复用 2.4 异步I/O 2.5 信号驱动 I/O 三、总结 一、I/O 模型简介 所谓的 I/O 就是计算机内存与外部设备之间拷贝数据数据的过程。有 5 中 I/O 模型&#xff0c;分别是同步阻塞 I/O、同步…

单端、差分信号处理抗干扰能力解析

采用仪表运放对信号源进行处理&#xff0c; 信号源地上有共模干扰&#xff0c;经过差分信号处理后Vout上不会有干扰&#xff0c;差分信号可以非常好的抗共模干扰。 经过差分信号处理后&#xff0c;以单端信号输出进入ADC还是会有干扰&#xff0c;所以信号链采用差分 处理后&…

Java二十三种设计模式-适配器模式(6/23)

适配器模式&#xff1a;使不兼容的接口协同工作的桥梁 引言 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间可以一起工作&#xff0c;通过将一个类的接口转换成客户端期望的另一个接口。 在计算机编程中&#x…

AI论文精读笔记-MAE

1. 论文基本信息 论文标题&#xff1a;Masked Autoencoders Are Scalable Vision Learners 作者&#xff1a;Kaiming He∗,† Xinlei Chen∗ Saining Xie Yanghao Li Piotr Doll ́ ar Ross Girshick 发表时间和期刊&#xff1a;19 Dec 2021; arxiv 论文链接&#xff1a;Mas…

苹果预计因Apple Intelligence引发设备升级潮

&#x1f989; AI新闻 &#x1f680; 苹果预计因Apple Intelligence引发设备升级潮 摘要&#xff1a;据彭博社报道&#xff0c;摩根士丹利将苹果列为首选股票&#xff0c;预期Apple Intelligence发布将引发创纪录的设备升级。分析师Erik Woodring 将苹果目标股价上调至273美元…

前端开发(基础)

目录 一、Web前端项目初始化 环境准备 创建项目 前端工程化配置 引入组件库 开发规范 全局通用布局 基础布局结构 全局底部栏 动态替换内容 全局顶部栏 通用路由菜单 支持多套布局 请求 请求工具库 全局自定义请求 自动生成请求代码 全局状态管理 全局权限管…

电力调度台如何助力电力指挥中心更智慧

在现代电力系统的复杂运行环境中&#xff0c;电力调度台正逐渐成为电力指挥中心实现智慧化管理的关键力量。 电力调度台具备强大的信息集成与处理能力。它能够将来自不同监测系统、传感器和数据源的海量数据汇聚一处&#xff0c;包括电力设备的实时运行状态、电力负荷的动态变化…

应急靶场(4):Windows Server 2019 - Web3

目录 一、攻击者的两个IP地址 二、隐藏用户名称 三、黑客遗留下的flag【3个】 下载好靶场&#xff08;前来挑战&#xff01;应急响应靶机训练-Web3&#xff09;并搭建好环境&#xff0c;使用帐号密码&#xff08;administrator / xj123456&#xff09;登录靶机。 一、攻击者的两…

张幼玲:心中有火,眼里有光照医路

在我们的传统社会中&#xff0c;男科医生这一职业往往被人们带着异样的眼光看待。然而&#xff0c;张幼玲却选择了这一领域&#xff0c;成为了一名专业男科医生。他以其丰富的临床经验、高超的医术和对患者的关爱&#xff0c;赢得了患者和社会的广泛赞誉。 张幼玲出生于一个中医…

ASP.NET Core----基础学习06----将所有数据在页面中显示 布局页面的使用

文章目录 1. 将数据以list的形式展示在页面中2. 布局页面的使用3. 自定义设置视图文件是否需要加载的JS 1. 将数据以list的形式展示在页面中 step1:在接口文件中添加新的方法GetAllStudents&#xff08;&#xff09; step2:在mock的数据中添加方法GetAllStudents&#xff08;&a…

7/13 - 7/15

vo.setId(rs.getLong("id"))什么意思&#xff1f; vo.setId(rs.getLong("id")); 这行代码是在Java中使用ResultSet对象&#xff08;通常用于从数据库中检索数据&#xff09;获取一个名为"id"的列&#xff0c;并将其作为long类型设置为一个对象…

Billu_b0x靶机

信息收集 使用arp-scan 生成网络接口地址来查看ip 输入命令&#xff1a; arp-scan -l 可以查看到我们的目标ip为192.168.187.153 nmap扫描端口开放 输入命令&#xff1a; nmap -min-rate 10000 -p- 192.168.187.153 可以看到开放2个端口 nmap扫描端口信息 输入命令&…