You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:15:03