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.mzph.cn/news/103292.shtml

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

相关文章

堆专题2 向上调整构建大顶堆

题目&#xff1a; 样例&#xff1a; 输入 6 3 2 6 5 8 7 输出 8 6 7 2 5 3 思路&#xff1a; 向上调整&#xff0c;就是从叶子结点开始 往 根节点 往上面调整&#xff0c;操作与 向下调整 操作类似&#xff0c;只是不用判断左右孩子&#xff0c;由于我们是从叶子结点开始 往 …

视频太大怎么压缩变小?超过1G的视频这样压缩

视频已经成为了我们日常生活中不可或缺的一部分&#xff0c;然而&#xff0c;很多时候&#xff0c;我们可能会遇到视频文件过大&#xff0c;无法在某些平台上传或保存的问题。那么&#xff0c;如何将过大的视频文件压缩变小呢&#xff1f; 下面就给大家分享三款实用的工具&…

STM32单片机入门学习(六)-光敏传感器控制LED

光敏传感器模块和LED接线 LED负极接B12,正极接VCC 光敏传感模块一DO端接B13,GND接GND&#xff0c;VCC接VCC,AO不接。 如图&#xff1a; 主程序代码&#xff1a;main.c #include "stm32f10x.h" #include "Delay.h" //delay函数所在头文件 #include …

【教学类-35-04】学号+姓名+班级(中3班)学号字帖(A4竖版2份 竖版长条)

图片展示: 背景需求: 2022年9-2023年1月我去过小3班带班&#xff0c;但是没有在这个班级投放过学具&#xff0c;本周五是我在本学期第一次带中3班&#xff0c;所以提供了一套学号描字帖。先让我把孩子的名字和脸混个眼熟。 之前试过一页两套名字的纸张切割方法有&#xff1a;…

机器人制作开源方案 | 双轮提升搬运小车

1. 功能描述 双轮提升搬运小车是一种用于搬运和移动物体的机械设备&#xff0c;它通常采用双轮驱动和提升装置。一般具备以下特点&#xff1a; ① 双轮驱动&#xff1a;该小车配备两个驱动轮&#xff0c;通过电动机或其它动力源驱动&#xff0c;提供足够的动力和扭矩&#xff0…

IOT 围炉札记

文章目录 一、蓝牙二、PAN1080三、IOT OS四、通讯 物联网&#xff08;英文&#xff1a;Internet of Things&#xff0c;缩写&#xff1a;IoT&#xff09;起源于传媒领域&#xff0c;是信息科技产业的第三次革命。物联网是指通过信息传感设备&#xff0c;按约定的协议&#xff0…

社区投稿| 以安全视角,深度剖析 Sui Staking 与 LSD

本篇技术研报由 MoveBit 研究团队的 Jason 撰写 #1 Sui Staking 介绍 1.1 Sui 网络概述 Sui 网络由一组独立的验证者运行&#xff0c;每个验证者在自己的机器或集群上运行独立的 Sui 软件实例。 Sui 采用委托权益证明&#xff08;DPoS&#xff09;来确定哪些验证者参与网络…

RT-Thread SMP介绍与移植(学习)

RT-Thread SMP介绍与移植 SMP&#xff1a;对称多处理&#xff08;Symmetrical Multi-Processing&#xff09;简称SMP&#xff0c;是指在一个计算机上汇集了一组处理器&#xff08;多CPU&#xff09;&#xff0c;各CPU之间共享内存子系统以及总线结构。 RT-Thread自4.0.0版本开…

CSS 中几种常用的换行方法

1、使用 br 元素&#xff1a; 最简单的换行方法是在需要换行的位置插入 元素。例如&#xff1a; <p>This is a sentence.<br>It will be on a new line.</p>这会在 “This is a sentence.” 和 “It will be on a new line.” 之间创建一个换行。 效果&a…

centos 7 lamp owncloud

OwnCloud是一款开源的云存储软件&#xff0c;基于PHP的自建网盘。基本上是私人使用&#xff0c;没有用户注册功能&#xff0c;但是有用户添加功能&#xff0c;你可以无限制地添加用户&#xff0c;OwnCloud支持多个平台&#xff08;windows&#xff0c;MAC&#xff0c;Android&a…

微信小程序服务通知(订阅消息)定时推送消息功能

首先先说项目需求&#xff1a;向预约参观的用户提前一天晚上8点推送消息。小程序端主要用到的API是我是小程序用到的API。以及服务端用到的API&#xff1a;我是服务端用到的API。 1. 开通订阅消息功能 (1)、 首先需要在小程序管理后台开通订阅消息功能。没开通前如下图所示: …

VScode Invoke-Expression: 无法将参数绑定到参数“Command”,因为该参数为空字符串

打开vscode时发生错误&#xff1a;Invoke-Expression : 无法将参数绑定到参数“Command”&#xff0c;因为该参数为空字符串。 解决办法&#xff1a;在anaconda prompt base中输入&#xff1a; conda upgrade -n base -c defaults --override-channels conda

Tableau:商业智能(BI)工具

Tableau入门 1、Tableau概述2、Tableau Desktop2.1、初识Tableau Desktop2.2、Tableau工作区2.3、数据窗格与分析窗格2.4、功能区和标记卡2.4.1、列和行功能区2.4.2、标记卡2.4.3、筛选器功能区2.4.4、页面功能区2.4.5、附加功能区、图例、控件 3、Tableau视图4、Tableau工作簿…

基于springboot实现校园闲置物品交易平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园闲置物品交易平台系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的交易方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&am…

javaweb:mybatis:mapper(sql映射+代理开发+配置文件之设置别名、多环境配置、顺序+注解开发)

1.0版本 sql映射文件实现 流程 首先程序进入启动类MyBatisDemo.java中&#xff0c;读取配置文件mybatis-config.xml 再由mybatis-config的mappers属性 <mappers><mapper resource"UserMapper.xml"></mapper></mappers>找到sql映射文件Use…

React18入门(第三篇)——React Hooks详解,React内置Hooks、自定义Hooks使用

文章目录 概述一、内置 Hook——useState1.1 响应式数据更新1.2 什么是 state1.3 state 特点&#xff08;一&#xff09;——异步更新1.4 state 特点&#xff08;二&#xff09;——可能会被合并1.5 state 特点&#xff08;三&#xff09;——不可变数据&#xff08;重要&#…

非肿瘤纯生信拿下7+,多种机器学习算法,搭配WGCNA。

今天给同学们分享一篇非肿瘤WGCNA机器学习的生信文章“Screening of immune-related secretory proteins linking chronic kidney disease with calcific aortic valve disease based on comprehensive bioinformatics analysis and machine learning”&#xff0c;这篇文章于2…

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘&#xff0c;删除主库过期wal文件重做备库后上午进行主备状态巡查&#xff0c;主库向备库发送wal文件正常&#xff0c;但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…

【算法-动态规划】零钱兑换问题-力扣 322

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

[ubuntu]OpenFOAM国内源码满速下载地址

下列地址可直接使用git clone&#xff0c;例如&#xff0c;打开终端&#xff0c;在终端直接将下面的复制进去&#xff1a; git clone https://e.coding.net/dyfluid/ThirdParty-6/ThirdParty-6.git即可在本地创建ThirdParty-6文件夹。如果提示你没有git&#xff0c;那么输入下面…