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

