Django实战项目-学习任务系统-用户注册

接着上期代码框架,开发第2个功能,用户注册,在原有用户模型基础上,增加一个学生用户属性表,用来关联学生用户的各种属性值,这个属性表是参考网络小说里系统属性值设计的,方便直观了解用户的能力高低,等级以及积分值等信息。

第一步:编写第二个功能-用户注册

1,编辑模型文件:

./mysite/study_system/models.py:

class StudyUserAttribute(models.Model):user = models.OneToOneField(StudyUser, on_delete=models.CASCADE, primary_key=True, verbose_name='用户属性ID')study_level = models.IntegerField(verbose_name='学习级别: 1-小学,2-初中,3-高中,4-本科,5-硕士,6-博士,7-博士后')intelligence = models.IntegerField(verbose_name='智力')memory = models.IntegerField(verbose_name='记忆力')diligence = models.IntegerField(verbose_name='勤奋力')physical_fitness = models.IntegerField(verbose_name='体能')total_points = models.IntegerField(verbose_name='总积分')other_subjects = models.CharField(max_length=100, verbose_name='其他学科属性')notes = models.TextField(verbose_name='备注')update_time = models.DateTimeField(verbose_name='更新时间')class Meta:verbose_name = '学生用户属性表'verbose_name_plural = '学生用户属性表'# 用于模型的数据库表的名称db_table = "study_user_attributes"def __str__(self):return str(self.user)

2,编辑urls配置文件:
./mysite/study_system/urls.py

urlpatterns = [# 登录首页urlpath('', views.index, name='index'),path('login/', LoginView.as_view(), name='login'),# 登录主页urlpath('home/', views.home, name='home'),# 注册urlpath('register/', views.register, name='register'),
]

3,编辑视图文件:
./mysite/study_system/views.py

def register(request):'''@方法名称: ajax请求, 表单视图,注册用户@作    者: PandaCode辉@weixin公众号: PandaCode辉@创建时间: 2023-10-10'''# 初始化响应容器rsp_dict = {"result": "error", "errorMsg": "系统错误"}# 是否ajax请求if request.is_ajax():try:rest = request.POST# 角色:1: 系统管理员;2: 辅导员;3: 学生;4-自导自学role = rest['role']username = rest['username']password = rest['password']email = rest['email']# print('email : '+str(email))# 根据邮箱查询校验账号是否存在exists = StudyUser.is_email_exists(email)# print('exists : '+str(exists))if exists:# 用户注册校验失败,显示错误信息rsp_dict["errorMsg"] = "该邮箱已经存在注册用户,不能重复注册."# 错误返回json数据格式return JsonResponse(rsp_dict)# 手机号初始为空phone_num = ""# 辅导员用户ID,学生用户必输parent_id = 0# 今天# UTC格式当前时区时间t = time.localtime()work_date = time.strftime("%Y-%m-%d %H:%M:%S", t)print('当前日期时间:' + str(work_date))# 3: 学生,需要关联对应辅导员账号if role == '3':# 根据辅导员邮箱查询辅导员的用户信息parent_email = rest['parent_email']parent_user = StudyUser.get_user_by_email(parent_email)# print('parent_user : '+str(parent_user))if parent_user:# 找到了与邮箱匹配的用户,访问用户的属性,辅导员用户IDparent_id = parent_user.user_idelse:# 没有找到与邮箱匹配的用户,执行相应的逻辑# 用户注册校验失败,显示错误信息rsp_dict["errorMsg"] = "没有找到与辅导员邮箱匹配的用户,注册失败."# 错误返回json数据格式return JsonResponse(rsp_dict)# 创建用户对象并保存到数据库user = StudyUser(role=role, username=username, password=password,email=email, phone_num=phone_num, parent_id=parent_id,created_time=work_date, update_time=work_date)# 保存用户表数据user.save()# 3: 学生;4-自导自学'。增加属性表数据if role in ('3', '4'):# 创建用户对象并保存到数据库,首次注册,所有属性值初始化为0或空userAttribute = StudyUserAttribute(user=user, study_level=1, intelligence=0, memory=0,diligence=0, physical_fitness=0,total_points=0, other_subjects="",notes="", update_time=work_date)# 保存属性表数据userAttribute.save()# 注册成功rsp_dict["result"] = "success"rsp_dict["errorMsg"] = "注册成功,请登录."# 成功返回json数据格式return JsonResponse(rsp_dict)except Exception as e:rsp_dict["errorMsg"] = "注册用户失败."# 错误返回json数据格式return JsonResponse(rsp_dict)else:# 跳转到注册页面return render(request, "study_system/register.html", rsp_dict)

4,编辑页面模板代码:

4.1. 用户注册页面
./mysite/study_system/templates/study_system/register.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>study system</title><link rel="stylesheet" href="/static/study_system/bootstrap3/css/bootstrap.min.css"><script type="text/javascript" src="/static/study_system/jquery1.3.3/jquery.min.js"></script><style>.container {max-width: 400px;margin: 0 auto;padding-top: 100px;}</style><script type="text/javascript">/* 自动载入 */$(function () {// 清空输入栏clean_input();});// 清空输入栏function clean_input() {$("#username").val("");$("#password").val("");$("#email").val("");$("#parent_email").val("");}// 学习模式切换不同角色选择function change_study_type() {var study_type = $("select[name='study_type']").val();{#alert(study_type);#}var optionHtml = "";if (study_type == '1') {optionHtml += "<option value='4'>自导自学</option>";} else {optionHtml += "<option value='2'>辅导员</option>";optionHtml += "<option value='3'>学生</option>";}{## 清空子元素#}$("select[name='role']").empty();// 添加到class=中$("select[name='role']").append(optionHtml);// 角色切换,显示,隐藏关联邮箱输入框change_role();// 清空输入栏clean_input();}// 角色切换,显示,隐藏关联邮箱输入框function change_role() {var role = $("select[name='role']").val();{#alert(role);#}if (role === '3') {$('#parent-email-group').show();} else {$('#parent-email-group').hide();}}//验证,用户名function check_username() {if ($("#username").val() == "") {alert("用户名,不能为空");return false;}return true;}//验证,密码function check_password() {if ($("#password").val() == "") {alert("密码,不能为空");return false;}return true;}//验证,邮箱function check_email() {if ($("#email").val() == "") {alert("邮箱,不能为空");return false;}return true;}//提交表单function submitRegister() {if (check_username() && check_password() && check_email()) {var role = $("#role").val();var username = $("#username").val();var password = $("#password").val();var email = $("#email").val();var parent_email = "";if (role == "3") {parent_email = $("#parent_email").val();}//alert("parent_email:" + parent_email);// 1,获取csrfmiddlewaretoken的input标签value属性对应的值{#var token = $('[name="csrfmiddlewaretoken"]').val();#}// 2,直接就能得到 csrfmiddlewaretoken 的input标签value属性的值var csrf_token = '{{ csrf_token }}';$.post("/study_system/register/",{'role': role,'username': username,'password': password,'email': email,'parent_email': parent_email,// 将token值放到请求数据部分,token的键必须是 csrfmiddlewaretoken'csrfmiddlewaretoken': csrf_token,}, function (data) {if ("success" == data.result) {alert("注册成功");// 注册成功,去登录页面window.location.href = "/study_system/login/";} else {alert("注册失败:" + data.errorMsg);}});}}</script>
</head>
<body>
<div class="container"><h2 class="text-center">注册用户</h2><form method="post" action="{% url 'study_system:register' %}">{# 在Django中提交数据到后端服务的时候,为了安全,要使用CSRF(跨站请求伪造)。#}{% csrf_token %}<div class="form-group"><label for="study_type">学习模式</label><select class="form-control" id="study_type" name="study_type" onchange="change_study_type()"><option value="1" selected="selected">单人模式</option><option value="2">双人模式</option></select></div><div class="form-group"><label for="role">角色类型</label><select class="form-control" id="role" name="role" onchange="change_role()">{#                <option value="2">辅导员</option>#}{#                <option value="3">学生</option>#}<option value="4" selected="selected">自导自学</option></select></div><div class="form-group"><label for="username">用户名</label><input type="text" class="form-control" id="username" name="username"></div><div class="form-group"><label for="password">密码</label><input type="password" class="form-control" id="password" name="password"></div><div class="form-group"><label for="email">邮箱</label><input type="email" class="form-control" id="email" name="email"></div><div id="parent-email-group" class="form-group" style="display: none;"><label for="parent_email">关联辅导员邮箱</label><input type="email" class="form-control" id="parent_email" name="parent_email"></div><div class="form-group"><button type="button" onclick="submitRegister()" class="form-control btn-primary">注册账户</button></div><div class="form-group"><button type="reset" class="form-control btn-primary" onclick="clearErrorMessage()">重置</button></div><div class="form-group"><a href="{% url 'study_system:login' %}" class="form-control btn-link text-right">登录账户</a></div></form>
</div>
</body>
</html>

第二步:运行测试-用户注册功能

1,双人模式

1.1,先注册一个辅导员用户

  作为老师/辅导员/家长等角色,用来发布任务,配置定时任务,维护兑换物品,发放奖励物品等,监督管理学生作用,因为没有真正的智能系统,需要人工监管学生的行为规范,督促学生完成学习任务,一个辅导员可以关联多个学生用户。

1.2,再注册一个学生用户

  作为学生角色,用来接收对应辅导员和系统发布的任务,完成任务,获取积分,兑换物品,扣除积分,拥有属性表值等,学生用户必须绑定关联一个辅导员用户。

1,单人模式

  自己发布任务给自己,自己学习完成任务,自己维护兑换物品,自己兑换奖励物品,没有其他人监督管理,该模式需要较强的自学能力。

-------------------------------------------------end -------------------------------------------------

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用摩尔信使MThings连接网络设备

帽子&#xff1a; 摩尔信使MThings支持Modbus-TCP、Modbus-RTU Over TCP、Modbus-TCP Over UDP、Modbus-RTU Over UDP。 TCP链接中&#xff0c;摩尔信使MThings支持灵活的连接方式&#xff0c;主机可作为客户端也可以作为服务端&#xff0c;同时支持模拟从机以客户端方式向远…

新媒体达人投放技巧有哪些,投放总结!

达人投放&#xff0c;一个当今时代品牌传播跳不开的词。关于达人投放的优势与特点&#xff0c;相信所有人都已经不在陌生。但是真的进行达人投放时&#xff0c;又该如何实施&#xff0c;今天来分享下新媒体达人投放技巧有哪些&#xff0c;投放总结&#xff01; 一、品牌不同阶段…

C语言,输出最长连号的个数

数据范围&#xff1a;0 < n <10000. 最长连号&#xff0c;就是一组数字里面出现的连续的数字的最长长度。这里的连号最长是2 3 4 5 6&#xff0c;个数为5。 要实现求连号的个数&#xff0c;就要创建一个变量&#xff0c;用来专门计算连号的个数。在不满足连号时&#xf…

【超分】A Benchmark for Chinese-English Scene Text Image Super-resolution

中英文场景文本图像超分辨率的基准 摘要&#xff1a;场景文本图像超分&#xff08;STISR&#xff0c;Scene Text Image Super-resolution&#xff09;就是将低分辨率图像恢复为具有令人愉快的视觉和可读的文本内容。现有工作都是处理笔画简单的英文字符而不是复杂的中文字符。…

安科瑞ARB5系列弧光保护装置,智能电弧光保护,保障用电安全

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 什么是弧光 电弧是放电过程中发生的一种现象&#xff0c;当两点之间的电压超过其工频绝缘强度极限时就会发生。当适当的条件出现时&#xff0c;一个携带着电流的等离子产生&#xff0c;直到电源侧的保护设备断开才会消失。空气在通常条件…

slamplay:用C++实现的SLAM工具集

0. 项目简介 slamplay 是一个功能强大的工具集合&#xff0c;可用于开始使用 C 来玩和试验 SLAM。这是一项正在进行的工作。它在单个 cmake 框架中安装并提供一些最重要的功能 后端框架&#xff08;g2o、gtsam、ceres、se-sync 等&#xff09;、 前端工具&#xff08;opencv、…

Python教程——配置环境,再探IDE

文章目录 一、Python安装下载安装验证 二、第一个Python程序常见问题 三、Python解释器四、PyCharm工具安装和配置安装使用PyCharm基本使用 一、Python安装 下载 如果我们想要使用Python语言编写程序&#xff0c;我们必须下载Python安装包并配置Python环境&#xff0c;我们现…

Apache Ranger:(一)安装部署

1.Ranger简介 Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计。它可以对Hadoop生态的组件如HDFS、Yarn、Hive、Hbase等进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问权限。 说白了就是管理大多数框架的授权问题。 …

arcgis地形分析全流程

主要内容&#xff1a;DEM的获取与处理、高程分析、坡度分析、坡向分析、地形起伏度分析、地表粗糙度分析、地表曲率分析&#xff1b; 主要工具&#xff1a;镶嵌至新栅格、按掩膜提取、投影栅格、坡度、坡向、焦点统计 一 DEM的获取与处理 1.1 DEM是什么&#xff1f; DEM(D…

ceph版本和Ceph的CSI驱动程序

ceph版本和Ceph的CSI驱动程序 ceph查看ceph版本Ceph的CSI驱动程序 ceph ceph版本和Ceph的CSI驱动程序 查看ceph版本 官网ceph-releases-index Ceph的CSI驱动程序 Ceph的CSI驱动程序 https://github.com/ceph/ceph-csi

F. Vasilije Loves Number Theory

Problem - F - Codeforces 思路&#xff1a;分析一下题意&#xff0c;对于第一种操作来说&#xff0c;每次乘以x&#xff0c;那么nn*x&#xff0c;然后问是否存在一个a使得gcd(n,a)1并且n*a的约数个数等于n&#xff0c;有最大公约数等于1我们能够知道其实这两个数是互质的&…

wireshark抓包分析HTTP协议,HTTP协议执行流程,

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 使用WireShark工具抓取「HTTP协议」的数据包&#…

RedissonClient中Stream流的简单使用

1、pub端 //获取一个流 RStream rStream redissonClient.getStream("testStream"); //创建一个map&#xff0c;添加数据 Map<String, Object> rr new HashMap<>(); rr.put("xx", RandomUtil.randomString(5)); //添加到流 rStream.addAll(r…

Allegro如何查看器件的管脚号?

Allegro在默认情况下,器件是不显示管脚号的。 Allegro默认情况下,器件不显示管脚编号。 在PCB布局时,有时候我们需要看器件的管脚号,然后才能方便布局。那如何查看器件的管脚号呢? 这里介绍两种查看器件的管脚编号的方法。 方法一: (1)选择菜单Display→Color/Visi…

一款好用的PDF文档解密软件

PDF Decrypter pro 纯免费&#xff0c;没有页数限制&#xff0c;没有额外水印&#xff0c;强烈推荐&#xff01;

提升后端API性能的几种解决方案

&#x1f514;目的 提升后端API性能的主要目的是为了提高系统整体的响应速度、并发能力以及可用性。主要原因包括: 提高用户体验 后端API性能好可以减少响应延迟,给用户流畅的体验。 提高系统吞吐量 优化API性能可以提高系统的整体吞吐量,处理更多用户请求。 节省服务器资源…

深入理解强化学习——强化学习和有监督学习

分类目录&#xff1a;《深入理解强化学习》总目录 通过前文的介绍&#xff0c;我们现在应该已经对强化学习的基本数学概念有了一定的了解。这里我们回过头来再看看一般的有监督学习和强化学习的区别。以图片分类为例&#xff0c;有监督学习&#xff08;Supervised Learning&…

利用Python构建自定义报告生成器支持SEO分析实战总结

在进行SEO&#xff08;搜索引擎优化&#xff09;分析时&#xff0c;定制化的报告生成器是非常有价值的工具之一。通过利用Python编程语言构建自定义报告生成器&#xff0c;可以更好地满足个性化的需求&#xff0c;并提供详尽的SEO分析结果。本文将分享一些实践经验&#xff0c;…

3、在 CentOS 8 系统上安装 PostgreSQL 15.4

PostgreSQL&#xff0c;作为一款备受欢迎的开源关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;已经存在了三十多年的历史。它提供了SQL语言支持&#xff0c;用于管理数据库和执行CRUD操作&#xff08;创建、读取、更新、删除&#xff09;。 由于其卓越的健壮性…

对比纯软开与嵌入式硬件开发谁更好呢?

对比纯软开与嵌入式硬件开发谁更好呢&#xff1f; 你的纠结和犹豫是理解的&#xff0c;职业选择确实是一个重要的决策。我明白你在嵌入式和软件开发之间犹豫不决的原因。让我给你提供一些建议&#xff0c;帮助你做出更明智的决定。最近很多小伙伴找我&#xff0c;说想要一些嵌入…