Django实战项目-学习任务系统-任务管理
接着上期代码框架,开发第3个功能,任务管理,再增加一个学习任务表,用来记录发布的学习任务的标题和内容,预计完成天数,奖励积分和任务状态等信息。
第一步:编写第三个功能-任务管理
1,编辑模型文件:
./mysite/study_system/models.py:
class StudyTask(models.Model):
task_id = models.AutoField(primary_key=True, verbose_name='任务ID')
task_type = models.IntegerField(verbose_name='任务类型')
task_title = models.CharField(max_length=100, verbose_name='任务标题')
task_description = models.TextField(verbose_name='任务描述')
reward_points = models.IntegerField(verbose_name='奖励积分')
deadline_days = models.IntegerField(verbose_name='预计完成天数')
actual_days = models.IntegerField(verbose_name='实际完成天数')
task_status = models.IntegerField(verbose_name='任务状态')
created_time = models.DateTimeField(verbose_name='创建时间')
update_time = models.DateTimeField(verbose_name='更新时间')
created_by = models.ForeignKey(StudyUser, on_delete=models.CASCADE, verbose_name='创建者ID') class Meta:
verbose_name = '学习任务表'
verbose_name_plural = '学习任务表'
# 用于模型的数据库表的名称
db_table = "study_tasks" def __str__(self):
return self.task_title
2,编辑urls配置文件:
./mysite/study_system/urls.py
# 任务管理url
path('task/getUndoTaskList/', views.getUndoTaskList, name='getUndoTaskList'),
path('task/toNewTask/', views.toNewTask, name='toNewTask'),
path('task/addNewTask/', views.addNewTask, name='addNewTask'),
3,编辑视图文件:
./mysite/study_system/views.py
def getUndoTaskList(request):
'''
@方法名称: 获取待完成任务列表
@作 者: PandaCode辉
@weixin公众号: PandaCode辉
@创建时间: 2023-10-10
'''
# 响应容器
rsp_dict = {}
# 获取当前用户名
username = request.session.get('username')
# 根据用户名获取用户对象
cur_user = StudyUser.objects.get(username=username)
print('根据用户名查询用户对象:' + str(cur_user)) user_list = [cur_user]
# 如果当前用户是:3-学生,则查找对应辅导员用户
if cur_user.role == 3:
parent_id = cur_user.parent_id
# 根据用户ID获取用户对象
parent_user = StudyUser.objects.get(user_id=parent_id)
print('根据用户ID获取用户对象:' + str(parent_user))
user_list = [cur_user, parent_user]
# 获取待完成任务列表
data_list = StudyTask.objects.filter(task_status=0, created_by__in=user_list).order_by('-pk') # 查询待完成任务列表
rsp_dict['data_list'] = data_list context_object_name = "undo_task_list"
template_name = "study_system/home.html"
# 'html_file': 'xxx.html' 动态指定模板页面 ; 'menuTo': 'task' = 任务管理 ;
rsp_dict['html_file'] = 'study_system/task/undoTaskList.html'
rsp_dict['menuTask'] = 'menuTask'
rsp_dict['context_object_name'] = context_object_name return render(request, template_name, rsp_dict) def toNewTask(request):
'''
@方法名称: 跳转到发布新任务视图
@作 者: PandaCode辉
@weixin公众号: PandaCode辉
@创建时间: 2023-10-10
'''
rsp_dict = {}
rsp_dict["pageTitle"] = "新增任务"
# 'html_file': 'xxx.html' 动态指定模板页面 ; 'menuTo': 'task' = 任务管理 ;
rsp_dict['html_file'] = 'study_system/task/addTask.html'
rsp_dict['menuTask'] = 'menuTask' return render(request, "study_system/home.html", rsp_dict) def addNewTask(request):
'''
@方法名称: ajax请求, 表单视图,发布新任务
@作 者: PandaCode辉
@weixin公众号: PandaCode辉
@创建时间: 2023-10-10
'''
# 初始化响应容器
rsp_dict = {"result": "error", "errorMsg": "系统错误"}
# 是否ajax请求
if request.is_ajax():
try:
rest = request.POST
task_title = rest['taskTitle']
task_type = int(rest['taskType'])
task_description = rest['taskDescription']
reward_points = int(rest['rewardPoints'])
deadline_days = int(rest['deadlineDays'])
actual_days = 0
task_status = 0
# 获取当前用户名
username = request.session.get('username')
# 根据用户名获取用户对象
cur_user = StudyUser.objects.get(username=username)
print('根据用户名查询用户对象:' + str(cur_user))
# 创建者ID,使用 StudyUser 对象赋值
created_by = cur_user # 今天
# UTC格式当前时区时间
t = time.localtime()
work_date = time.strftime("%Y-%m-%d %H:%M:%S", t)
print('当前日期时间:' + str(work_date)) # 创建对象并保存到数据库
study_task = StudyTask(task_title=task_title, task_type=task_type, task_description=task_description,
reward_points=reward_points, deadline_days=deadline_days, task_status=task_status,
actual_days=actual_days, created_by=created_by, created_time=work_date,
update_time=work_date)
# 保存到数据库是否成功
study_task.save() rsp_dict["result"] = "success"
except Exception as e:
rsp_dict["errorMsg"] = "发布新任务保存到数据库失败." # 成功与否都返回json数据格式
return JsonResponse(rsp_dict)
4,编辑页面模板代码:
4.1. 待完成任务列表页面
./mysite/study_system/templates/study_system/task/undoTaskList.html
{% if request.session.role == 1 or request.session.role == 2 or request.session.role == 4 %}
{# 【角色 :1-系统管理员 】#}
{# 【角色 :2-辅导员 】#}
{# 【角色 :4-自导自学 】#}
<div>
<a href="/study_system/task/toNewTask/" class="btn btn-default btn-lg btn-block btn-a">发布新任务</a>
</div>
{% endif %}
<!-- 结果显示区 -->
<div id="dataList">
{% if data_list %}
{% for studyTask in data_list %}
<ul class="dataCardList">
<li class="btn-group btn-group-justified">
{% if request.session.role == 1 or request.session.role == 2 or request.session.role == 4 %}
{# 【角色 :1-系统管理员 】#}
{# 【角色 :2-辅导员 】#}
{# 【角色 :4-自导自学 】#}
<a href="#"
class="btn btn-default btn-lg">修改</a>
<a href="#" class="btn btn-default btn-lg">删除</a>
{% elif request.session.role == 3 %}
{# 【角色 :3-学生用户 】#}
<a href="#" class="btn btn-default btn-lg">删除</a>
{% endif %}
</li>
<li>【任务ID :{{ studyTask.task_id }}】</li>
<li>【任务发布者 :{{ studyTask.created_by.username }}】</li>
<li>【发布时间 :{{ studyTask.update_time|date:'Y-m-d H:i:s' }}】</li>
<li>【任务名称 :{{ studyTask.task_title }}】</li>
{% if studyTask.task_type == "1" %}
<li style='color: blue'>【任务类型 :1-系统任务】</li>
{% elif studyTask.task_type == "2" %}
<li>【任务类型 :2-辅导员任务】</li>
{% endif %}
<li>【任务内容说明 :{{ studyTask.task_description }}】</li>
<li>【计划完成天数 :{{ studyTask.deadline_days }} 天】</li>
<li style='color: red'>【成功奖励 :+{{ studyTask.reward_points }} 积分】</li>
{# 除法 : {% widthratio 5 100 1%}#}
{# note:等同于:(5 / 100) * 1,则结果返回0.05,和乘法一样,使「参数3」= 1就是除法了。#}
{# 失败处罚积分为成功奖励积分的一半,所以是 undoTask.7 / 2#}
<li style='color: green'>【失败处罚 :-{% widthratio studyTask.reward_points 2 1 %} 积分】</li>
{% if request.session.role == 1 or request.session.role == 3 or request.session.role == 4 %}
{# 【角色 :1-系统管理员 】#}
{# 【角色 :3-学生 】#}
{# 【角色 :4-自导自学 】#}
<li>
<a href="#"
class="btn btn-default btn-lg btn-block btn-a">完成</a>
</li>
{% endif %}
</ul>
{% endfor %}
{% else %}
<strong>查无记录</strong>
{% endif %}
</div>
4.2. 发布任务页面
./mysite/study_system/templates/study_system/task/addTask.html
<script type="text/javascript">
function addNewTask() {
var taskTitle = $("#taskTitle").val();
var taskType = $("#taskType").val();
var taskDescription = $("#taskDescription").val();
var deadlineDays = $("#deadlineDays").val();
var rewardPoints = $("#rewardPoints").val();
// 1,获取csrfmiddlewaretoken的input标签value属性对应的值
{#var token = $('[name="csrfmiddlewaretoken"]').val();#}
// 2,直接就能得到 csrfmiddlewaretoken 的input标签value属性的值
var csrf_token = '{{ csrf_token }}';
$.post("/study_system/task/addNewTask/",
{
'taskTitle': taskTitle,
'taskType': taskType,
'taskDescription': taskDescription,
'deadlineDays': deadlineDays,
'rewardPoints': rewardPoints,
// 将token值放到请求数据部分,token的键必须是 csrfmiddlewaretoken
'csrfmiddlewaretoken': csrf_token,
}, function (data) {
if ("success" == data.result) {
alert("发布成功");
window.location.href = "/study_system/task/getUndoTaskList";
} else {
alert("发布失败:" + data.errorMsg);
}
});
}
</script>
<div class="container">
<h1 class="text-center">发布新任务</h1>
<form action="/study_system/task/addNewTask/" method="post" class="form-horizontal" role="form">
{% csrf_token %}
{# 在Django中提交数据到后端服务的时候,为了安全,要使用CSRF(跨站请求伪造)。#}
{# 跨站请求伪造的问题在于,服务器信任来自客户端的数据。#}
{# 常规的做法是在template模板HTML文件中的form表单 中添加 {% csrf_token %} 可以实现安全提交。#}
{# 当我们使用from表单标签来发送请求时,如果需要csrf_token认证,那么必须将它写到我们的form表单标签里面,里面的任意位置。#}
{# 生成的隐藏标签为:#}
{# <input type="hidden" name="csrfmiddlewaretoken" value="WVHKQeAuMS4RGqyLybryIBAfacDa1Dp7PEaB3Badv3y0fvLqydX36xAVen6z3oS4">#}
<div class="form-group">
<label for="taskType" class="col-sm-2 control-label">任务类型</label>
<div class="col-sm-10">
<select class="form-control" name="taskType" id="taskType">
{% if request.session.role == 1 %}
<option value="1" selected="selected">1-系统任务</option>
{% elif request.session.role == 2 %}
<option value="2" selected="selected">2-辅导员任务</option>
{% endif %}
</select>
</div>
</div>
<div class="form-group">
<label for="taskTitle" class="col-sm-2 control-label">任务名称</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="taskTitle" id="taskTitle" maxlength="12" size="20" placeholder="请输入任务名称">
</div>
</div>
<div class="form-group">
<label for="taskDescription" class="col-sm-2 control-label">任务内容说明</label>
<div class="col-sm-10">
<textarea name="taskDescription" id="taskDescription" class="form-control" rows="4"></textarea>
</div>
</div>
<div class="form-group">
<label for="deadlineDays" class="col-sm-2 control-label">计划完成天数</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="deadlineDays" id="deadlineDays" placeholder="请输入计划完成天数">
</div>
</div>
<div class="form-group">
<label for="rewardPoints" class="col-sm-2 control-label">任务奖励积分</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="rewardPoints" id="rewardPoints" placeholder="请输入任务奖励积分">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<a href="javascript:addNewTask()" class="btn btn-default btn-lg btn-block btn-a">提交发布</a>
</div>
</div>
</form>
</div>
第二步:运行测试-任务管理功能
1,登录用户后,先查看待完成任务列表页面

2,发布新任务页面


-------------------------------------------------end -------------------------------------------------
Django实战项目-学习任务系统-任务管理的更多相关文章
- 01-Flutter移动电商实战-项目学习记录
一直想系统性的学习一下 Flutter,正好看到该课程<Flutter移动电商实战>的百度云资源,共 69 课时,由于怕自己坚持不下去(经常学着学着就不学了),故采用博客监督以记之. 1. ...
- Node.js实战项目学习系列(1) 初识Node.js
前言 一直想好好学习node.js都是半途而废的状态,这次沉下心来,想好好的学习下node.js.打算写一个系列的文章大概10几篇文章,会一直以实际案例作为贯穿的学习. 什么是node Node.js ...
- SpringMVC+Mybatis+Mysql实战项目学习--环境搭建
1.开发IDE:Spring Tool Suite(自带maven插件) 下载地址https://spring.io/tools/sts/all 在STS.ini配置信息中加下面一行 保证编码格式为u ...
- Node.js实战项目学习系列(2) 开发环境和调试工具
前言 上一节让我们对Node.js有一个初步的了解,那么现在可以开始正式学习下Node.js的开发了,但是任何一门语言要设计到开发,就必须先学习开发环境以及调试.本文将主要讲解这些内容. 本文涉及到的 ...
- Node.js实战项目学习系列(4) node 对象(global、process进程、debug调试)
前言 在之前的课程我们学习了Node的模块化规则,接下来我们将学习下 Node的几个新特性:global ,process进程,debug调试 global 跟在浏览器中的window一样都是全局变量 ...
- Node.js实战项目学习系列(5) node基础模块 path
前言 前面已经学习了很多跟Node相关的知识,譬如开发环境.CommonJs,那么从现在开始要正式学习node的基本模块了,开始node编程之旅了. path path 模块提供用于处理文件路径和目录 ...
- Django ---- blog项目学习所得
一.登录功能 1.采用ajax 提交form表单的方式 2.后台生成随机验证码,登录时提交验证码 3.用PLI库生成随机验证码,置于session中,登录时与前台提交的code进行upeer()的验证 ...
- Node.js实战项目学习系列(3) CommonJS 模块化规范
前言 想开始编写Node.js代码,那么我们就必须先熟悉它的模块化规范CommonJS,本文将详细讲解CommonJS规范 本文代码 >>> github 地址 CommonJS N ...
- Python Django CMDB项目实战之-1如何开启一个Django-并设置base页、index页、文章页面
1.环境 win10 python 2.7.14 django 1.8.2 需要用到的依赖包:MySQLdb(数据库的接口包).PIL/pillow(处理图片的包) 安装命令: pip install ...
- Python Django CMDB项目实战之-3创建form表单,并在前端页面上展示
基于之前的项目代码 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页.index页.文章页面 Python Django CMDB项目实战之-2创建APP. ...
随机推荐
- 网络编程入门从未如此简单(二):假如你来设计TCP协议,会怎么做?
本文原题"你管这破玩意儿叫TCP?",由闪客sun分享,转载请联系作者. 1.引言 网络编程能力对于即时通讯技术开发者来说是基本功,而计算机网络又是网络编程的理论根基,因而深刻准确 ...
- 即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第9 期. [-1-] 少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别 [链接] http ...
- vue基础4
Q:1.动画的使用方法以及动画库的使用方式 2.vue中的指令有哪些? 3.vue中生命周期钩子函数有哪些?分别代表什么含义? 4.filter的语法是什么? 5.computed的特点是什么? 6. ...
- Linux 常用脚本命令-lsof、find、rpm、SS、top、vim
1,关机命令 1 shutdown -h now/0 2 halt 3 init 0 4 poweroff 5 举例: 6 shutdown -h 3 ------3分钟后关机(可用shutdown ...
- biancheng-Python教程
目录http://c.biancheng.net/python/ 1Python编程基础2Python编程环境搭建3变量类型和运算符4列表.元组.字典和集合5Python字符串常用方法6Python流 ...
- MySQL如果数据存在则更新,不存在则插入
如果数据存在则更新,不存在则插入,MySQL有duplicate.replace into.replace三种方式如何更新数据? insert ignore into 又是如何插入数据的呢? 准备表和 ...
- Python读取txt文本
转载:Python读取txt文本三种方式 python常用的读取文件函数有三种read().readline().readlines() read() 一次性读取所有文本,在读取文本中含有中文时是gk ...
- Oracle连接 ORA-28001: 口令已经失效解决方法
cmd进入命令行 C:\Users\Administrator>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期 ...
- 生成对抗网络GAN简介
本文分享自天翼云开发者社区<生成对抗网络GAN简介>,作者:王****青 生成对抗网络(Generative Adversarial Networks,GAN)是一种深度敏感词模型,用于生 ...
- Sa-Token v1.40.0 发布 🚀,来看看有没有令你心动的功能!
Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证.权限认证.单点登录.OAuth2.0.微服务网关鉴权 等一系列权限相关问题. 目前最新版本 v1.40.0 已发布至 Mav ...