设计公司网站推广营销,环球经贸网,如何通过域名访问网站,龙岩市住房和城乡建设厅网站首页接着上期代码框架#xff0c;开发第3个功能#xff0c;任务管理#xff0c;再增加一个学习任务表#xff0c;用来记录发布的学习任务的标题和内容#xff0c;预计完成天数#xff0c;奖励积分和任务状态等信息。 第一步#xff1a;编写第三个功能-任务管理
1#xff0…接着上期代码框架开发第3个功能任务管理再增加一个学习任务表用来记录发布的学习任务的标题和内容预计完成天数奖励积分和任务状态等信息。 第一步编写第三个功能-任务管理
1编辑模型文件
./mysite/study_system/models.py:
class StudyTask(models.Model):task_id models.AutoField(primary_keyTrue, verbose_name任务ID)task_type models.IntegerField(verbose_name任务类型)task_title models.CharField(max_length100, 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_deletemodels.CASCADE, verbose_name创建者ID)class Meta:verbose_name 学习任务表verbose_name_plural 学习任务表# 用于模型的数据库表的名称db_table study_tasksdef __str__(self):return self.task_title 2编辑urls配置文件 ./mysite/study_system/urls.py
# 任务管理url
path(task/getUndoTaskList/, views.getUndoTaskList, namegetUndoTaskList),
path(task/toNewTask/, views.toNewTask, nametoNewTask),
path(task/addNewTask/, views.addNewTask, nameaddNewTask),
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(usernameusername)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_idparent_id)print(根据用户ID获取用户对象: str(parent_user))user_list [cur_user, parent_user]# 获取待完成任务列表data_list StudyTask.objects.filter(task_status0, created_by__inuser_list).order_by(-pk)# 查询待完成任务列表rsp_dict[data_list] data_listcontext_object_name undo_task_listtemplate_name study_system/home.html# html_file: xxx.html 动态指定模板页面 ; menuTo: task 任务管理 rsp_dict[html_file] study_system/task/undoTaskList.htmlrsp_dict[menuTask] menuTaskrsp_dict[context_object_name] context_object_namereturn render(request, template_name, rsp_dict)def toNewTask(request):方法名称: 跳转到发布新任务视图作 者: PandaCode辉weixin公众号: PandaCode辉创建时间: 2023-10-10rsp_dict {}rsp_dict[pageTitle] 新增任务# html_file: xxx.html 动态指定模板页面 ; menuTo: task 任务管理 rsp_dict[html_file] study_system/task/addTask.htmlrsp_dict[menuTask] menuTaskreturn 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.POSTtask_title rest[taskTitle]task_type int(rest[taskType])task_description rest[taskDescription]reward_points int(rest[rewardPoints])deadline_days int(rest[deadlineDays])actual_days 0task_status 0# 获取当前用户名username request.session.get(username)# 根据用户名获取用户对象cur_user StudyUser.objects.get(usernameusername)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_titletask_title, task_typetask_type, task_descriptiontask_description,reward_pointsreward_points, deadline_daysdeadline_days, task_statustask_status,actual_daysactual_days, created_bycreated_by, created_timework_date,update_timework_date)# 保存到数据库是否成功study_task.save()rsp_dict[result] successexcept 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-自导自学 】#}diva href/study_system/task/toNewTask/ classbtn btn-default btn-lg btn-block btn-a发布新任务/a/div
{% endif %}
!-- 结果显示区 --
div iddataList{% if data_list %}{% for studyTask in data_list %}ul classdataCardListli classbtn-group btn-group-justified{% if request.session.role 1 or request.session.role 2 or request.session.role 4 %}{# 【角色 1-系统管理员 】#}{# 【角色 2-辅导员 】#}{# 【角色 4-自导自学 】#}a href#classbtn btn-default btn-lg修改/aa href# classbtn btn-default btn-lg删除/a{% elif request.session.role 3 %}{# 【角色 3-学生用户 】#}a href# classbtn btn-default btn-lg删除/a{% endif %}/lili【任务ID {{ studyTask.task_id }}】/lili【任务发布者 {{ studyTask.created_by.username }}】/lili【发布时间 {{ studyTask.update_time|date:Y-m-d H:i:s }}】/lili【任务名称 {{ studyTask.task_title }}】/li{% if studyTask.task_type 1 %}li stylecolor: blue【任务类型 1-系统任务】/li{% elif studyTask.task_type 2 %}li【任务类型 2-辅导员任务】/li{% endif %}li【任务内容说明 {{ studyTask.task_description }}】/lili【计划完成天数 {{ studyTask.deadline_days }} 天】/lili stylecolor: red【成功奖励 {{ studyTask.reward_points }} 积分】/li{# 除法 : {% widthratio 5 100 1%}#}{# note:等同于(5 / 100) * 1,则结果返回0.05,和乘法一样使「参数3」 1就是除法了。#}{# 失败处罚积分为成功奖励积分的一半所以是 undoTask.7 / 2#}li stylecolor: 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-自导自学 】#}lia href#classbtn 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 typetext/javascriptfunction 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 $([namecsrfmiddlewaretoken]).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的键必须是 csrfmiddlewaretokencsrfmiddlewaretoken: csrf_token,}, function (data) {if (success data.result) {alert(发布成功);window.location.href /study_system/task/getUndoTaskList;} else {alert(发布失败: data.errorMsg);}});}
/script
div classcontainerh1 classtext-center发布新任务/h1form action/study_system/task/addNewTask/ methodpost classform-horizontal roleform{% csrf_token %}{# 在Django中提交数据到后端服务的时候为了安全要使用CSRF跨站请求伪造。#}{# 跨站请求伪造的问题在于服务器信任来自客户端的数据。#}{# 常规的做法是在template模板HTML文件中的form表单 中添加 {% csrf_token %} 可以实现安全提交。#}{# 当我们使用from表单标签来发送请求时如果需要csrf_token认证那么必须将它写到我们的form表单标签里面里面的任意位置。#}{# 生成的隐藏标签为#}{# input typehidden namecsrfmiddlewaretoken valueWVHKQeAuMS4RGqyLybryIBAfacDa1Dp7PEaB3Badv3y0fvLqydX36xAVen6z3oS4#}div classform-grouplabel fortaskType classcol-sm-2 control-label任务类型/labeldiv classcol-sm-10select classform-control nametaskType idtaskType{% if request.session.role 1 %}option value1 selectedselected1-系统任务/option{% elif request.session.role 2 %}option value2 selectedselected2-辅导员任务/option{% endif %}/select/div/divdiv classform-grouplabel fortaskTitle classcol-sm-2 control-label任务名称/labeldiv classcol-sm-10input typetext classform-control nametaskTitle idtaskTitle maxlength12 size20 placeholder请输入任务名称/div/divdiv classform-grouplabel fortaskDescription classcol-sm-2 control-label任务内容说明/labeldiv classcol-sm-10textarea nametaskDescription idtaskDescription classform-control rows4/textarea/div/divdiv classform-grouplabel fordeadlineDays classcol-sm-2 control-label计划完成天数/labeldiv classcol-sm-10input typetext classform-control namedeadlineDays iddeadlineDays placeholder请输入计划完成天数/div/divdiv classform-grouplabel forrewardPoints classcol-sm-2 control-label任务奖励积分/labeldiv classcol-sm-10input typetext classform-control namerewardPoints idrewardPoints placeholder请输入任务奖励积分/div/divdiv classform-groupdiv classcol-sm-offset-2 col-sm-10a hrefjavascript:addNewTask() classbtn btn-default btn-lg btn-block btn-a提交发布/a/div/div/form
/div
第二步运行测试-任务管理功能
1登录用户后先查看待完成任务列表页面 2发布新任务页面 -------------------------------------------------end -------------------------------------------------