接着上期代码框架,开发第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 = [
# 登录首页url
path('', views.index, name='index'),
path('login/', LoginView.as_view(), name='login'),
# 登录主页url
path('home/', views.home, name='home'),
# 注册url
path('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:
# 找到了与邮箱匹配的用户,访问用户的属性,辅导员用户ID
parent_id = parent_user.user_id
else:
# 没有找到与邮箱匹配的用户,执行相应的逻辑
# 用户注册校验失败,显示错误信息
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 -------------------------------------------------

Django实战项目-学习任务系统-用户注册的更多相关文章

  1. 01-Flutter移动电商实战-项目学习记录

    一直想系统性的学习一下 Flutter,正好看到该课程<Flutter移动电商实战>的百度云资源,共 69 课时,由于怕自己坚持不下去(经常学着学着就不学了),故采用博客监督以记之. 1. ...

  2. Node.js实战项目学习系列(1) 初识Node.js

    前言 一直想好好学习node.js都是半途而废的状态,这次沉下心来,想好好的学习下node.js.打算写一个系列的文章大概10几篇文章,会一直以实际案例作为贯穿的学习. 什么是node Node.js ...

  3. SpringMVC+Mybatis+Mysql实战项目学习--环境搭建

    1.开发IDE:Spring Tool Suite(自带maven插件) 下载地址https://spring.io/tools/sts/all 在STS.ini配置信息中加下面一行 保证编码格式为u ...

  4. Node.js实战项目学习系列(2) 开发环境和调试工具

    前言 上一节让我们对Node.js有一个初步的了解,那么现在可以开始正式学习下Node.js的开发了,但是任何一门语言要设计到开发,就必须先学习开发环境以及调试.本文将主要讲解这些内容. 本文涉及到的 ...

  5. Node.js实战项目学习系列(4) node 对象(global、process进程、debug调试)

    前言 在之前的课程我们学习了Node的模块化规则,接下来我们将学习下 Node的几个新特性:global ,process进程,debug调试 global 跟在浏览器中的window一样都是全局变量 ...

  6. Node.js实战项目学习系列(5) node基础模块 path

    前言 前面已经学习了很多跟Node相关的知识,譬如开发环境.CommonJs,那么从现在开始要正式学习node的基本模块了,开始node编程之旅了. path path 模块提供用于处理文件路径和目录 ...

  7. Django ---- blog项目学习所得

    一.登录功能 1.采用ajax 提交form表单的方式 2.后台生成随机验证码,登录时提交验证码 3.用PLI库生成随机验证码,置于session中,登录时与前台提交的code进行upeer()的验证 ...

  8. Node.js实战项目学习系列(3) CommonJS 模块化规范

    前言 想开始编写Node.js代码,那么我们就必须先熟悉它的模块化规范CommonJS,本文将详细讲解CommonJS规范 本文代码 >>> github 地址 CommonJS N ...

  9. Python Django CMDB项目实战之-1如何开启一个Django-并设置base页、index页、文章页面

    1.环境 win10 python 2.7.14 django 1.8.2 需要用到的依赖包:MySQLdb(数据库的接口包).PIL/pillow(处理图片的包) 安装命令: pip install ...

  10. Python Django CMDB项目实战之-3创建form表单,并在前端页面上展示

    基于之前的项目代码 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页.index页.文章页面 Python Django CMDB项目实战之-2创建APP. ...

随机推荐

  1. Qt数据库应用8-数据导出组件示例说明

    一.前言 为了方便用户学习使用本组件,特意针对每个功能模块,每种可能的应用场景,都编写了对应的示例demo,从初级示例到中级示例再到高级示例以及多线程示例等,层层加码,针对结构体数据都做了相当详细细致 ...

  2. UOS系统mysql服务安装

    UOS系统mysql服务安装 背景 1.安装环境:kvm虚拟机 2.运行环境:uos server-1060e 3.架构:x86 4.安装mysql版本:mysql-5.7 1.安装准备 # Mysq ...

  3. Dynamic CRM最常用的3种查询方式

    在crm系统中 接口或者插件中 通常都会有查询的校验 实际上单查询的话 不用crm提供的方式也可以 直接用sql的方式去查,一般涉及到很多表的联动查询比如报表查询时,还是用sql更方便   一.Que ...

  4. Solution -「LOCAL」菜

    \(\mathscr{Description}\)   Private link.   给定 \(N,L,X,Y,K\),求选出 \(0\le a_1\le a_2\le\cdots a_{N-1}\ ...

  5. 将Ldap组织结构及用户信息同步到MySQL,用Spring Boot项目操作

    从上一篇<将Mybatis引入Spring Boot项目连接数据库操作>知道了如何在Spring Boot项目操作数据库,学会了增删查改基本操作方法.本节记录如何从Ldap获取组织结构及用 ...

  6. STL 容器操作

    vector set转化为vector:vec.assign(set.begin(), set.end()) map 1. map默认从小到达排序,想要从大到小,可以: map<string, ...

  7. Golang sync.pool源码解析

    Golang sync.pool源码解析 - sync.pool - 是什么 - 怎么用 - demo - 真实世界的使用 - 源码解读-数据结构 - 源码解读-读写流程 - 写流程 - 读流程 - ...

  8. DAB实现中用到的主要设计模式

    DAB C++ 版本设计模式应用实践 1. 命令模式 (Command Pattern) 设计目标 模块解耦:实现各模块独立编译.测试.运行,消除模块间直接依赖 扩展准备:为桥接模式实现奠定基础 依赖 ...

  9. DeepSeek太火,但老板们别慌,这里有份AI项目开展手册

    关注公众号回复1 获取一线.总监.高管<管理秘籍> 这两天有老板陆续在咨询:到底应该如何基于DeepSeek开展AI项目? 抛开一些偏细节.偏敏感的付费内容,其实有一套方法论倒是可以分享. ...

  10. 用python做时间序列预测四:*稳/非*稳时间序列

    上篇文章简单提到了应该用*稳时间序列做预测,本文将介绍具体概念和原因. Stationary Series *稳序列 *稳序列有三个基本标准: 1.序列的均值(mean)不应该是时间的函数(意思是不应 ...