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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:25:23