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

Django中ModelForm渲染批量审批单选按钮的name属性问题

解决方案:为每个PendingRequest实例生成独立的审批表单

1. 定义带动态name属性的ModelForm

创建一个ModelForm,在初始化时接收请求ID,动态修改单选按钮组的name属性,确保每个请求的表单字段唯一:

from django import forms
from .models import PendingRequest

class ApprovalForm(forms.ModelForm):
    class Meta:
        model = PendingRequest
        fields = ['status']
        widgets = {
            'status': forms.RadioSelect(choices=[
                ('approve', '审批'),
                ('decline', '拒绝'),
            ])
        }

    def __init__(self, *args, **kwargs):
        # 取出传入的请求ID,用于生成唯一name
        self.request_id = kwargs.pop('request_id', None)
        super().__init__(*args, **kwargs)
        if self.request_id:
            # 为单选组设置带请求ID的name属性
            self.fields['status'].widget.attrs['name'] = f'approval_{self.request_id}'

假设你的PendingRequest模型包含status字段,用于存储审批状态(例如pending/approved/declined)。

2. 视图中为每个请求实例绑定表单

在视图里遍历所有待审批请求,为每个实例创建对应的ApprovalForm并传入请求ID:

from django.shortcuts import render, redirect
from .models import PendingRequest
from .forms import ApprovalForm

def pending_requests_view(request):
    pending_reqs = PendingRequest.objects.filter(status='pending')
    request_form_pairs = []

    if request.method == 'POST':
        # 处理提交的审批操作
        for req in pending_reqs:
            submit_key = f'submit_{req.id}'
            if submit_key in request.POST:
                # 获取对应请求的审批状态
                status = request.POST.get(f'approval_{req.id}')
                if status == 'approve':
                    req.status = 'approved'
                elif status == 'decline':
                    req.status = 'declined'
                req.save()
                return redirect('pending_requests')  # 提交后重定向刷新页面

    # GET请求时为每个请求绑定表单
    for req in pending_reqs:
        form = ApprovalForm(request_id=req.id, instance=req)
        request_form_pairs.append( (req, form) )

    return render(request, 'pending_requests.html', {
        'request_form_pairs': request_form_pairs
    })

3. 模板渲染每个请求的表单

在模板里遍历请求和表单对,渲染单选按钮组和提交按钮:

{% for req, form in request_form_pairs %}
    <div class="request-card">
        <h3>请求ID: {{ req.id }}</h3>
        <p>申请人: {{ req.user.username }}</p>
        <p>请求内容: {{ req.content }}</p>
        
        <!-- 渲染审批/拒绝单选按钮 -->
        {{ form.status }}
        
        <!-- 对应请求的提交按钮 -->
        <button type="submit" name="submit_{{ req.id }}">确认操作</button>
    </div>
{% endfor %}

关键说明

  • 通过在表单初始化时传入request_id,动态生成approval_{req.id}格式的name属性,确保每个请求的单选组独立,避免name冲突。
  • 提交按钮的name设置为submit_{req.id},视图中通过判断该key是否存在,确定哪个请求的操作被提交,再获取对应状态值更新模型。
  • 保留了ModelForm的字段验证、模型实例绑定等优势,同时解决了单选组name不唯一的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:15:33