• Django实战项目-学习任务系统-任务管理


    接着上期代码框架,开发第3个功能,任务管理,再增加一个学习任务表,用来记录发布的学习任务的标题和内容,预计完成天数,奖励积分和任务状态等信息。

    第一步:编写第三个功能-任务管理

    1,编辑模型文件:

    ./mysite/study_system/models.py:

    1. class StudyTask(models.Model):
    2. task_id = models.AutoField(primary_key=True, verbose_name='任务ID')
    3. task_type = models.IntegerField(verbose_name='任务类型')
    4. task_title = models.CharField(max_length=100, verbose_name='任务标题')
    5. task_description = models.TextField(verbose_name='任务描述')
    6. reward_points = models.IntegerField(verbose_name='奖励积分')
    7. deadline_days = models.IntegerField(verbose_name='预计完成天数')
    8. actual_days = models.IntegerField(verbose_name='实际完成天数')
    9. task_status = models.IntegerField(verbose_name='任务状态')
    10. created_time = models.DateTimeField(verbose_name='创建时间')
    11. update_time = models.DateTimeField(verbose_name='更新时间')
    12. created_by = models.ForeignKey(StudyUser, on_delete=models.CASCADE, verbose_name='创建者ID')
    13. class Meta:
    14. verbose_name = '学习任务表'
    15. verbose_name_plural = '学习任务表'
    16. # 用于模型的数据库表的名称
    17. db_table = "study_tasks"
    18. def __str__(self):
    19. return self.task_title

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

    1. # 任务管理url
    2. path('task/getUndoTaskList/', views.getUndoTaskList, name='getUndoTaskList'),
    3. path('task/toNewTask/', views.toNewTask, name='toNewTask'),
    4. path('task/addNewTask/', views.addNewTask, name='addNewTask'),


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

    1. def getUndoTaskList(request):
    2. '''
    3. @方法名称: 获取待完成任务列表
    4. @作 者: PandaCode辉
    5. @weixin公众号: PandaCode辉
    6. @创建时间: 2023-10-10
    7. '''
    8. # 响应容器
    9. rsp_dict = {}
    10. # 获取当前用户名
    11. username = request.session.get('username')
    12. # 根据用户名获取用户对象
    13. cur_user = StudyUser.objects.get(username=username)
    14. print('根据用户名查询用户对象:' + str(cur_user))
    15. user_list = [cur_user]
    16. # 如果当前用户是:3-学生,则查找对应辅导员用户
    17. if cur_user.role == 3:
    18. parent_id = cur_user.parent_id
    19. # 根据用户ID获取用户对象
    20. parent_user = StudyUser.objects.get(user_id=parent_id)
    21. print('根据用户ID获取用户对象:' + str(parent_user))
    22. user_list = [cur_user, parent_user]
    23. # 获取待完成任务列表
    24. data_list = StudyTask.objects.filter(task_status=0, created_by__in=user_list).order_by('-pk')
    25. # 查询待完成任务列表
    26. rsp_dict['data_list'] = data_list
    27. context_object_name = "undo_task_list"
    28. template_name = "study_system/home.html"
    29. # 'html_file': 'xxx.html' 动态指定模板页面 ; 'menuTo': 'task' = 任务管理 ;
    30. rsp_dict['html_file'] = 'study_system/task/undoTaskList.html'
    31. rsp_dict['menuTask'] = 'menuTask'
    32. rsp_dict['context_object_name'] = context_object_name
    33. return render(request, template_name, rsp_dict)
    34. def toNewTask(request):
    35. '''
    36. @方法名称: 跳转到发布新任务视图
    37. @作 者: PandaCode辉
    38. @weixin公众号: PandaCode辉
    39. @创建时间: 2023-10-10
    40. '''
    41. rsp_dict = {}
    42. rsp_dict["pageTitle"] = "新增任务"
    43. # 'html_file': 'xxx.html' 动态指定模板页面 ; 'menuTo': 'task' = 任务管理 ;
    44. rsp_dict['html_file'] = 'study_system/task/addTask.html'
    45. rsp_dict['menuTask'] = 'menuTask'
    46. return render(request, "study_system/home.html", rsp_dict)
    47. def addNewTask(request):
    48. '''
    49. @方法名称: ajax请求, 表单视图,发布新任务
    50. @作 者: PandaCode辉
    51. @weixin公众号: PandaCode辉
    52. @创建时间: 2023-10-10
    53. '''
    54. # 初始化响应容器
    55. rsp_dict = {"result": "error", "errorMsg": "系统错误"}
    56. # 是否ajax请求
    57. if request.is_ajax():
    58. try:
    59. rest = request.POST
    60. task_title = rest['taskTitle']
    61. task_type = int(rest['taskType'])
    62. task_description = rest['taskDescription']
    63. reward_points = int(rest['rewardPoints'])
    64. deadline_days = int(rest['deadlineDays'])
    65. actual_days = 0
    66. task_status = 0
    67. # 获取当前用户名
    68. username = request.session.get('username')
    69. # 根据用户名获取用户对象
    70. cur_user = StudyUser.objects.get(username=username)
    71. print('根据用户名查询用户对象:' + str(cur_user))
    72. # 创建者ID,使用 StudyUser 对象赋值
    73. created_by = cur_user
    74. # 今天
    75. # UTC格式当前时区时间
    76. t = time.localtime()
    77. work_date = time.strftime("%Y-%m-%d %H:%M:%S", t)
    78. print('当前日期时间:' + str(work_date))
    79. # 创建对象并保存到数据库
    80. study_task = StudyTask(task_title=task_title, task_type=task_type, task_description=task_description,
    81. reward_points=reward_points, deadline_days=deadline_days, task_status=task_status,
    82. actual_days=actual_days, created_by=created_by, created_time=work_date,
    83. update_time=work_date)
    84. # 保存到数据库是否成功
    85. study_task.save()
    86. rsp_dict["result"] = "success"
    87. except Exception as e:
    88. rsp_dict["errorMsg"] = "发布新任务保存到数据库失败."
    89. # 成功与否都返回json数据格式
    90. return JsonResponse(rsp_dict)

    4,编辑页面模板代码:

    4.1. 待完成任务列表页面
    ./mysite/study_system/templates/study_system/task/undoTaskList.html

    1. {% if request.session.role == 1 or request.session.role == 2 or request.session.role == 4 %}
    2. {# 【角色 :1-系统管理员 】#}
    3. {# 【角色 :2-辅导员 】#}
    4. {# 【角色 :4-自导自学 】#}
    5. <div>
    6. <a href="/study_system/task/toNewTask/" class="btn btn-default btn-lg btn-block btn-a">发布新任务a>
    7. div>
    8. {% endif %}
    9. <div id="dataList">
    10. {% if data_list %}
    11. {% for studyTask in data_list %}
    12. <ul class="dataCardList">
    13. <li class="btn-group btn-group-justified">
    14. {% if request.session.role == 1 or request.session.role == 2 or request.session.role == 4 %}
    15. {# 【角色 :1-系统管理员 】#}
    16. {# 【角色 :2-辅导员 】#}
    17. {# 【角色 :4-自导自学 】#}
    18. <a href="#"
    19. class="btn btn-default btn-lg">修改a>
    20. <a href="#" class="btn btn-default btn-lg">删除a>
    21. {% elif request.session.role == 3 %}
    22. {# 【角色 :3-学生用户 】#}
    23. <a href="#" class="btn btn-default btn-lg">删除a>
    24. {% endif %}
    25. li>
    26. <li>【任务ID :{{ studyTask.task_id }}】li>
    27. <li>【任务发布者 :{{ studyTask.created_by.username }}】li>
    28. <li>【发布时间 :{{ studyTask.update_time|date:'Y-m-d H:i:s' }}】li>
    29. <li>【任务名称 :{{ studyTask.task_title }}】li>
    30. {% if studyTask.task_type == "1" %}
    31. <li style='color: blue'>【任务类型 :1-系统任务】li>
    32. {% elif studyTask.task_type == "2" %}
    33. <li>【任务类型 :2-辅导员任务】li>
    34. {% endif %}
    35. <li>【任务内容说明 :{{ studyTask.task_description }}】li>
    36. <li>【计划完成天数 :{{ studyTask.deadline_days }} 天】li>
    37. <li style='color: red'>【成功奖励 :+{{ studyTask.reward_points }} 积分】li>
    38. {# 除法 : {% widthratio 5 100 1%}#}
    39. {# note:等同于:(5 / 100) * 1,则结果返回0.05,和乘法一样,使「参数3」= 1就是除法了。#}
    40. {# 失败处罚积分为成功奖励积分的一半,所以是 undoTask.7 / 2#}
    41. <li style='color: green'>【失败处罚 :-{% widthratio studyTask.reward_points 2 1 %} 积分】li>
    42. {% if request.session.role == 1 or request.session.role == 3 or request.session.role == 4 %}
    43. {# 【角色 :1-系统管理员 】#}
    44. {# 【角色 :3-学生 】#}
    45. {# 【角色 :4-自导自学 】#}
    46. <li>
    47. <a href="#"
    48. class="btn btn-default btn-lg btn-block btn-a">完成a>
    49. li>
    50. {% endif %}
    51. ul>
    52. {% endfor %}
    53. {% else %}
    54. <strong>查无记录strong>
    55. {% endif %}
    56. div>

    4.2. 发布任务页面
    ./mysite/study_system/templates/study_system/task/addTask.html

    1. <script type="text/javascript">
    2. function addNewTask() {
    3. var taskTitle = $("#taskTitle").val();
    4. var taskType = $("#taskType").val();
    5. var taskDescription = $("#taskDescription").val();
    6. var deadlineDays = $("#deadlineDays").val();
    7. var rewardPoints = $("#rewardPoints").val();
    8. // 1,获取csrfmiddlewaretoken的input标签value属性对应的值
    9. {#var token = $('[name="csrfmiddlewaretoken"]').val();#}
    10. // 2,直接就能得到 csrfmiddlewaretoken 的input标签value属性的值
    11. var csrf_token = '{{ csrf_token }}';
    12. $.post("/study_system/task/addNewTask/",
    13. {
    14. 'taskTitle': taskTitle,
    15. 'taskType': taskType,
    16. 'taskDescription': taskDescription,
    17. 'deadlineDays': deadlineDays,
    18. 'rewardPoints': rewardPoints,
    19. // 将token值放到请求数据部分,token的键必须是 csrfmiddlewaretoken
    20. 'csrfmiddlewaretoken': csrf_token,
    21. }, function (data) {
    22. if ("success" == data.result) {
    23. alert("发布成功");
    24. window.location.href = "/study_system/task/getUndoTaskList";
    25. } else {
    26. alert("发布失败:" + data.errorMsg);
    27. }
    28. });
    29. }
    30. script>
    31. <div class="container">
    32. <h1 class="text-center">发布新任务h1>
    33. <form action="/study_system/task/addNewTask/" method="post" class="form-horizontal" role="form">
    34. {% csrf_token %}
    35. {# 在Django中提交数据到后端服务的时候,为了安全,要使用CSRF(跨站请求伪造)。#}
    36. {# 跨站请求伪造的问题在于,服务器信任来自客户端的数据。#}
    37. {# 常规的做法是在template模板HTML文件中的form表单 中添加 {% csrf_token %} 可以实现安全提交。#}
    38. {# 当我们使用from表单标签来发送请求时,如果需要csrf_token认证,那么必须将它写到我们的form表单标签里面,里面的任意位置。#}
    39. {# 生成的隐藏标签为:#}
    40. {# <input type="hidden" name="csrfmiddlewaretoken" value="WVHKQeAuMS4RGqyLybryIBAfacDa1Dp7PEaB3Badv3y0fvLqydX36xAVen6z3oS4">#}
    41. <div class="form-group">
    42. <label for="taskType" class="col-sm-2 control-label">任务类型label>
    43. <div class="col-sm-10">
    44. <select class="form-control" name="taskType" id="taskType">
    45. {% if request.session.role == 1 %}
    46. <option value="1" selected="selected">1-系统任务option>
    47. {% elif request.session.role == 2 %}
    48. <option value="2" selected="selected">2-辅导员任务option>
    49. {% endif %}
    50. select>
    51. div>
    52. div>
    53. <div class="form-group">
    54. <label for="taskTitle" class="col-sm-2 control-label">任务名称label>
    55. <div class="col-sm-10">
    56. <input type="text" class="form-control" name="taskTitle" id="taskTitle" maxlength="12" size="20" placeholder="请输入任务名称">
    57. div>
    58. div>
    59. <div class="form-group">
    60. <label for="taskDescription" class="col-sm-2 control-label">任务内容说明label>
    61. <div class="col-sm-10">
    62. <textarea name="taskDescription" id="taskDescription" class="form-control" rows="4">textarea>
    63. div>
    64. div>
    65. <div class="form-group">
    66. <label for="deadlineDays" class="col-sm-2 control-label">计划完成天数label>
    67. <div class="col-sm-10">
    68. <input type="text" class="form-control" name="deadlineDays" id="deadlineDays" placeholder="请输入计划完成天数">
    69. div>
    70. div>
    71. <div class="form-group">
    72. <label for="rewardPoints" class="col-sm-2 control-label">任务奖励积分label>
    73. <div class="col-sm-10">
    74. <input type="text" class="form-control" name="rewardPoints" id="rewardPoints" placeholder="请输入任务奖励积分">
    75. div>
    76. div>
    77. <div class="form-group">
    78. <div class="col-sm-offset-2 col-sm-10">
    79. <a href="javascript:addNewTask()" class="btn btn-default btn-lg btn-block btn-a">提交发布a>
    80. div>
    81. div>
    82. form>
    83. div>


    第二步:运行测试-任务管理功能

    1,登录用户后,先查看待完成任务列表页面

    2,发布新任务页面

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

  • 相关阅读:
    new Promise(function(resolve, reject){}) 的reject相当于抛异常
    Vue 的最大的优势是什么?
    米小樽MiMe三店同开,应时手作的高品质米乳饮品新体验
    学习Python,你至少要练习这些代码之13
    十四、应用监控(1)
    React state(及组件) 的保留与重置
    动态规划-状态机(188. 买卖股票的最佳时机 IV)
    答辩提纲的内容
    tiup dm disable
    lstat,fstat,unmask,chmod,chown,文件截断函数,空洞文件
  • 原文地址:https://blog.csdn.net/xionghui2007/article/details/134069955