您现在的位置是: 网站首页 >Django >Django轮班排班管理系统 Django
【Schedule轮班排班】02.配置首页展示功能
admin2018年11月28日 13:38 【Django | Html | JavaScript | Python 】 1738人已围观
Django轮班排班管理系统简介 基于内部业务需求,某些岗位需要进行工作日值班以及周六值班, 如果每次手动去制作Excel排班表,确实比较费时间,就考虑自动化生成的方式去做。 没有什么技术含量,可以了解下循环生成数据方法。我也没找到相关的代码参考,个人写的很烂,仅供参考。 环境要求:Django2.x.x
http://127.0.0.1:8000/duty/generate/date/ 页面展示 ![BLOG_20181128_135051_78](/media/blog/images/2018/11/BLOG_20181128_135051_78.png "博客图集BLOG_20181128_135051_78.png") ## 创建base模板 在schedule应用下的templates目录中创建base-duty.html模板,用于该app的共用模板,该模板还继承了base-rearend-hadmin.html,内容如下 ```html <!--博客管理页面基础模板--> {% extends 'base-rearend-hadmin.html' %} {% load static %} <!--该页使用css--> {% block css %} {% endblock %} <!--页面标题--> {% block title %}{{ block.super }} - 值班安排表{% endblock %} <!--页面LOGO--> {% block logo %} <i class="glyphicon glyphicon-list-alt"></i> <strong class="font-bold">工作值班安排</strong> {% endblock %} <!--菜单栏缩小时LOGO--> {% block logosm %}Duty{% endblock %} <!--导航菜单--> {% block menu %} <li class="line dk"></li> <li class="hidden-folded padder m-t m-b-sm text-muted text-xs"> <span class="ng-scope">Duty</span> </li> {% url 'duty:schedule' as schedule %} <li class="{% if schedule == request.path %}active{% endif %}"> <a class="" href="{{ schedule }}"> <i class="fa fa-calendar"></i> <span class="nav-label">值班安排</span> </a> </li> {% endblock %} <!--系统消息--> {% block message %} {% endblock %} <!--页面标题--> {% block head %}值班安排{% endblock %} <!--面包屑--> {% block breadcrumb %} <li> <a href="/">主页</a> </li> <li> <strong>值班安排</strong> </li> {% endblock %} <!--页面使用js--> {% block js %} {% endblock %} ``` ## 创建主页视图 设置了全局值班表存储excel路径 修改views.py增加`ScheduleIndex(View)`视图,该视图主要展示近30天值班情况,已经用户可以导出近4个月值班表的按钮名称和链接 ```python from django.shortcuts import render, redirect, reverse, HttpResponse from django.urls import reverse_lazy from django.views.generic import View, UpdateView, DeleteView, ListView, CreateView from django.conf import settings from django.db.models import Q import calendar import datetime import os import json import xlwt from .models import Employee, Schedule, LegalDay # 导出路径 file_save_path = 'schedule/exportfiles/' # 定义全局文件存储路径 schedule_path = os.path.join(settings.MEDIA_ROOT, file_save_path) print(schedule_path) if not os.path.exists(schedule_path): # 导出目录不存在则创建,需要根据项目路径变化 os.makedirs(schedule_path) # 创建目录 class ScheduleIndex(View): """ 查询排班表数据,显示今天+前10天+后19天,总共30天的排班信息 """ def get(self, request): today = datetime.date.today() start_date = today - datetime.timedelta(10) # 时间往前10天 end_date = today + datetime.timedelta(19) show_schedule = Schedule.objects.filter(date__range=(start_date, end_date)).order_by('date') # 需要显示的值班 # 导出功能,显示月份 mouth1 = today.month year1 = today.year date1 = str(year1) + '-' + str(mouth1) date1v = '导出%s年%s月数据' % (str(year1), str(mouth1)) mouth0 = mouth1 - 1 if mouth0 < 1: year0 = year1 - 1 mouth0 = mouth0 + 12 else: year0 = year1 date0 = str(year0) + '-' + str(mouth0) date0v = '导出%s年%s月数据' % (str(year0), str(mouth0)) mouth2 = mouth1 + 1 if mouth2 > 12: year2 = year1 + 1 mouth2 = mouth2 - 12 else: year2 = year1 date2 = str(year2) + '-' + str(mouth2) date2v = '导出%s年%s月数据' % (str(year2), str(mouth2)) mouth3 = mouth1 + 2 if mouth3 > 12: year3 = year1 + 1 mouth3 = mouth3 - 12 else: year3 = year1 date3 = str(year3) + '-' + str(mouth3) date3v = '导出%s年%s月数据' % (str(year3), str(mouth3)) schedule_excel = os.listdir(schedule_path) # 显示导出的文件名 schedule_excel_url = settings.MEDIA_URL + file_save_path # /static/schedule/exportfiles/ # print(schedule_excel) return render(request, 'schedule-index.html', locals()) ``` ## 创建schedule-index.html主页模板 该模板继承base-duty.html ```html {% extends 'base-duty.html' %} {% load duty_template_tags %} {% block title %}{{ block.super }} - 近期排班{% endblock %} {% block breadcrumb %} <li> <a href="/">主页</a> </li> <li> <strong>近期排班</strong> </li> {% endblock %} {% block content %} <div class="ibox float-e-margins"> <div class="ibox-title"> <h5>值班排版表(每页显示{{ show_schedule.count }}条数据)</h5> </div> <div class="ibox-content"> <table class="table table-striped"> <thead> <tr> <th class="text-center">日期</th> <th>星期</th> <th class="text-center">值班人员</th> <th class="text-center">换班人员</th> <th class="text-center">操作</th> </tr> </thead> <tbody> {% for schedule in show_schedule %} <tr {% if schedule.date == today %} style="background-color:#FFFF37;" {% endif %} {% if not schedule.is_workday %} style="background: #00E3E3" {% endif %} > <td class="text-center">{{ schedule.date }}</td> <td> {% get_week_day schedule.date %} {% if schedule.duty_type == 2 %} <i class="fa fa-bell"></i> {% elif schedule.duty_type == 0 %} <i class="fa fa-bed"></i> {% endif %} </td> <td class="text-center">{{ schedule.staff|default_if_none:'' }}</td> <td class="text-center">{{ schedule.real_staff|default_if_none:'' }}</td> <td class="text-center"> </td> </tr> {% endfor %} </tbody> </table> <div> <a class="btn btn-default btn-sm" href="">{{ date0v }}</a> <a class="btn btn-primary btn-sm" href="">{{ date1v }}</a> <a class="btn btn-default btn-sm" href="">{{ date2v }}</a> <a class="btn btn-default btn-sm" href="">{{ date3v }}</a> <a class="btn btn-warning btn-sm" href="">清空导出</a> </div> <div> {% for excel in schedule_excel %} <a href="" download="{{ excel }}" class="link_button btn btn-info">下载{{ excel }}</a> {% empty %} {% endfor %} </div> </div> </div> {% endblock %} ``` 由于需要获取到该日期是星期几,需要一个模板标签来获取 ## 创建模板标签获取星期 在应用下创建templatetags包,然后创建`duty_template_tags.py`文件,在里面写一个获取星期的模板标签 ```python from django import template register = template.Library() # 根据日期返回星期 @register.simple_tag def get_week_day(date): week_day_dict = { 0: '星期一', 1: '星期二', 2: '星期三', 3: '星期四', 4: '星期五', 5: '星期六', 6: '星期天', } day = date.weekday() return week_day_dict[day] ``` 这样可以在模板中导入`{% load duty_template_tags %}`,然后使用`{% get_week_day schedule.date %}`来调用该函数,得到星期 ## 添加路由 最后给该视图添加一个url,在应用下创建urls.py文件,然后写入 ```python from django.urls import path from .views import ScheduleIndex from django.contrib.auth.decorators import permission_required app_name = 'duty' urlpatterns = [ path('schedule/',permission_required('usercenter.permission_user_manage', raise_exception=True)(ScheduleIndex.as_view()), name='schedule'), # 值班表首页 ] ``` 注意这添加了访问权限,变为`ScheduleIndex.as_view()`即可,后面遇到的也作相同处理。 http://127.0.0.1:8000/duty/schedule/
很赞哦! (0)