如何在Django中实现Request模型的审批/驳回状态切换功能?
解决方案
1. 规范Request模型定义
先确保你的模型字段配置正确,通过choices限定可选状态,避免非法值:
# models.py from django.db import models class Request(models.Model): STATUS_CHOICES = [ ('Awaiting', 'Awaiting'), ('Approved', 'Approved'), ('Rejected', 'Rejected'), ] status = models.CharField( max_length=20, choices=STATUS_CHOICES, default='Awaiting' ) # 其他业务字段(如申请人、申请内容等)...
2. 创建状态切换表单
使用ModelForm快速生成仅包含status字段的表单,并限制可选值为需要切换的两种状态:
# forms.py from django import forms from .models import Request class RequestStatusForm(forms.ModelForm): class Meta: model = Request fields = ['status'] widgets = { 'status': forms.Select(choices=[('Approved', 'Approved'), ('Rejected', 'Rejected')]) }
3. 编写视图处理逻辑
函数视图实现
# views.py from django.shortcuts import get_object_or_404, render, redirect from .models import Request from .forms import RequestStatusForm def update_request_status(request, pk): # 获取目标请求实例 request_obj = get_object_or_404(Request, pk=pk) if request.method == 'POST': # 绑定实例与POST数据,验证后保存 form = RequestStatusForm(request.POST, instance=request_obj) if form.is_valid(): form.save() # 跳转回请求详情页(替换为你的实际URL名称) return redirect('request_detail', pk=pk) else: # GET请求时,用当前实例初始化表单 form = RequestStatusForm(instance=request_obj) return render(request, 'update_status.html', {'form': form, 'request_obj': request_obj})
类视图实现(可选)
如果习惯用基于类的视图,可使用UpdateView简化代码:
# views.py from django.views.generic.edit import UpdateView from django.urls import reverse_lazy from .models import Request from .forms import RequestStatusForm class RequestStatusUpdateView(UpdateView): model = Request form_class = RequestStatusForm template_name = 'update_status.html' # 成功提交后跳转的URL(替换为你的实际路由) success_url = reverse_lazy('request_list')
4. 编写模板文件
创建update_status.html模板,渲染表单并显示当前状态:
<!-- templates/update_status.html --> <h3>修改请求状态</h3> <p>当前状态:<strong>{{ request_obj.status }}</strong></p> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">保存状态</button> </form>
5. 配置URL路由
在项目或应用的urls.py中添加路由映射:
# urls.py from django.urls import path from . import views urlpatterns = [ # 其他路由... # 函数视图路由 path('request/<int:pk>/update-status/', views.update_request_status, name='update_request_status'), # 类视图路由(二选一) # path('request/<int:pk>/update-status/', views.RequestStatusUpdateView.as_view(), name='update_request_status'), ]
内容的提问来源于stack exchange,提问作者Mazen Mamdouh
相关产品推荐
相关产品推荐

