基于Django的休假管理表单自动化功能实现咨询
休假管理应用自动化配置实现方案
一、不同请假类型剩余可休天数配置实现
步骤1:预设各请假类型年度天数阈值
首先在现有模型文件中定义各假类的标准可休天数,替换原来的全局DAYS常量:
# 新增:各请假类型年度默认可休天数,可根据实际业务调整 LEAVE_TYPE_DEFAULT_DAYS = { SICK: 10, CASUAL: 15, EMERGENCY: 5, STUDY: 20, MATERNITY: 128 }
如果后续需要支持不同用户额度不同,可新增LeaveAllocation模型存储每个用户每年度各假类的专属额度,无需调整主逻辑。
步骤2:实现剩余可休天数计算逻辑
在Leave模型中新增方法,计算当前用户对应假类的年度剩余可休天数:
from django.db.models import Sum from datetime import datetime class Leave(models.Model): # 原有字段保持不变 def get_remaining_days(self): # 统计当前用户本年度该假类已审批通过的总天数 current_year = datetime.now().year used_days = Leave.objects.filter( user=self.user, leavetype=self.leavetype, status='approved', startdate__year=current_year ).aggregate(total=Sum('defaultdays'))['total'] or 0 total_quota = LEAVE_TYPE_DEFAULT_DAYS.get(self.leavetype, 0) return max(total_quota - used_days, 0)
步骤3:前后端交互与校验
- 前端:用户选择请假类型后,异步请求后端接口获取该用户对应假类的剩余可休天数,实时展示在表单中,同时限制用户填写的休假天数不能超过剩余额度
- 后端:在模型的
clean方法中新增校验逻辑,避免前端校验被绕过:
from django.core.exceptions import ValidationError class Leave(models.Model): # 原有字段、方法保持不变 def clean(self): # 校验休假天数不超过剩余额度 remaining = self.get_remaining_days() if self.defaultdays > remaining: raise ValidationError(f"该假类剩余可休天数为{remaining},申请天数超出额度") super().clean()
二、自动计算排除周末的休假结束日期实现
步骤1:实现工作日计算工具函数
from datetime import timedelta def calculate_end_date(start_date, leave_days): current_date = start_date days_counted = 0 while days_counted < leave_days: # 周六对应weekday值为5,周日为6,直接跳过 if current_date.weekday() < 5: days_counted +=1 if days_counted < leave_days: current_date += timedelta(days=1) return current_date
步骤2:前后端交互与校验
- 前端:用户选定开始日期、填写完休假天数后,可直接用JS实现上述计算逻辑,自动填充结束日期输入框,也可请求后端接口返回计算结果
- 后端:同样在模型
clean方法中补充结束日期校验:
class Leave(models.Model): # 原有字段、方法保持不变 def clean(self): # 原有额度校验逻辑不变 # 新增:校验结束日期是否符合排除周末的规则 expected_end = calculate_end_date(self.startdate, self.defaultdays) if self.enddate != expected_end: raise ValidationError(f"结束日期计算错误,排除周末后对应结束日期应为{expected_end}") super().clean()
如果存在法定节假日需要排除的需求,可在计算逻辑中引入法定节假日日期列表做过滤即可
内容的提问来源于stack exchange,提问作者Rainbow-Musoke
相关产品推荐
相关产品推荐

