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

如何在Django REST Framework中基于类视图实现请假审批工作流?

嘿,我来帮你梳理下如何用Django类视图实现这个请假工作流~ 咱们一步步来,从视图层到URL配置都给你安排得明明白白:

第一步:先对齐请假模型的核心字段

首先得确保你的Leave模型包含这些关键字段(如果还没加的话),这样后续视图才能正常工作:

from django.db import models
from django.contrib.auth.models import User

class Leave(models.Model):
    STATUS_CHOICES = (
        ('pending', '待处理'),
        ('approved', '已批准'),
        ('rejected', '已驳回'),
    )
    # 请假员工
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='leaves')
    # 请假时间范围
    start_date = models.DateField()
    end_date = models.DateField()
    # 请假理由
    reason = models.TextField()
    # 申请状态,默认待处理
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    # 审批人,可为空(待处理时还没审批人)
    approved_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='approved_leaves')
    # 申请创建时间
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.user.username}的请假申请 ({self.start_date} 至 {self.end_date})"
第二步:实现核心类视图

咱们需要三个类视图来覆盖整个流程:员工提交申请、查看待处理详情、主管审批操作。

1. 员工提交请假申请:LeaveCreateView

用CreateView封装表单提交逻辑,保存申请后自动重定向到该申请的待处理详情页:

from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Leave

class LeaveCreateView(LoginRequiredMixin, CreateView):
    model = Leave
    # 员工需要填写的必填字段,和模型对应
    fields = ['start_date', 'end_date', 'reason']
    # 你的表单模板路径,自己根据项目结构调整
    template_name = 'leave/leave_form.html'

    def form_valid(self, form):
        # 自动把当前登录用户设为请假申请人,不用员工手动填
        form.instance.user = self.request.user
        # 调用父类方法保存表单数据
        response = super().form_valid(form)
        return response

    def get_success_url(self):
        # 提交成功后,重定向到刚创建的申请的待处理详情页
        return reverse_lazy('leave_pending_detail', kwargs={'pk': self.object.pk})

2. 展示待处理申请详情:LeavePendingDetailView

用DetailView展示申请的详细信息,同时区分员工和主管的可见内容(比如主管能看到审批按钮):

from django.views.generic.detail import DetailView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Leave

class LeavePendingDetailView(LoginRequiredMixin, DetailView):
    model = Leave
    template_name = 'leave/leave_pending_detail.html'
    # 模板中用来指代申请对象的变量名
    context_object_name = 'leave'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 判断当前用户是否是申请人的主管,这里假设User模型有manager字段
        # 你可以根据自己的业务调整,比如用用户组判断:request.user.groups.filter(name='主管').exists()
        context['is_manager'] = self.request.user == self.object.user.manager
        return context

3. 主管审批/驳回申请:LeaveApprovalView

用UpdateView处理状态更新,同时加权限控制,确保只有主管能操作:

from django.views.generic.edit import UpdateView
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from .models import Leave

class LeaveApprovalView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Leave
    # 只允许修改状态字段,避免篡改其他信息
    fields = ['status']
    template_name = 'leave/leave_approval_form.html'

    def form_valid(self, form):
        # 自动把当前登录的主管设为审批人
        form.instance.approved_by = self.request.user
        return super().form_valid(form)

    def get_success_url(self):
        # 审批完成后,重定向回该申请的详情页(也可以改成主管的审批列表页)
        return reverse_lazy('leave_pending_detail', kwargs={'pk': self.object.pk})

    def test_func(self):
        # 验证当前用户是否是申请人的主管,权限控制的核心逻辑
        leave = self.get_object()
        return self.request.user == leave.user.manager
第三步:配置URL路由

把上面的视图映射到对应的URL,这样用户就能访问到了:

from django.urls import path
from .views import LeaveCreateView, LeavePendingDetailView, LeaveApprovalView

urlpatterns = [
    # 员工提交请假申请的URL
    path('apply/', LeaveCreateView.as_view(), name='leave_apply'),
    # 待处理申请详情页URL
    path('pending/<int:pk>/', LeavePendingDetailView.as_view(), name='leave_pending_detail'),
    # 主管审批操作的URL
    path('approve/<int:pk>/', LeaveApprovalView.as_view(), name='leave_approve'),
]
第四步:简单模板示例(供参考)

员工提交表单模板 (leave/leave_form.html)

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交请假申请</button>
</form>

待处理详情页模板 (leave/leave_pending_detail.html)

<h2>请假申请详情</h2>
<p>申请人: {{ leave.user.username }}</p>
<p>开始日期: {{ leave.start_date }}</p>
<p>结束日期: {{ leave.end_date }}</p>
<p>请假理由: {{ leave.reason }}</p>
<p>当前状态: {{ leave.get_status_display }}</p>

{% if is_manager %}
    <a href="{% url 'leave_approve' leave.pk %}">点击审批该申请</a>
{% endif %}

主管审批模板 (leave/leave_approval_form.html)

<h2>审批请假申请</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交审批结果</button>
</form>
一些小补充
  • 主管判断逻辑:上面用了user.manager的假设,你可以根据自己的业务调整,比如用用户组、角色字段等方式区分主管。
  • 权限控制:UserPassesTestMixin确保只有主管能进入审批页面,LoginRequiredMixin确保所有操作都需要登录。
  • 重定向逻辑:你可以修改get_success_url,比如审批后跳转到主管的所有待审批申请列表,而不是单个详情页。

内容的提问来源于stack exchange,提问作者Philip Mutua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:01:45