如何在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
相关产品推荐
相关产品推荐

