如何在Django-Tables2表格中提交操作后将‘Add’按钮改为‘Done’
嘿,这个需求很常见,我来帮你一步步实现按钮到“Done”文本的切换!核心思路就是判断每行的记录是否已经关联了ProcessReg条目,然后根据这个条件渲染不同的内容。
第一步:修复视图里的表单初始化问题
先看你的edit_item视图,GET请求时错误地把request.POST传给了表单,这会导致GET请求时表单绑定空数据,可能引发异常。改一下:
def edit_item(request, pk): item = get_object_or_404(BAReg, id=pk) if request.method == "POST": form = ProcessForm(request.POST, instance=item) if form.is_valid(): processes = form.cleaned_data.get('process') for country in processes: issue = ProcessReg() issue.ba = item.ba issue.regulation = item.regulation issue.process = country issue.save() return redirect('secondpage') else: # GET请求时只传instance,不要request.POST form = ProcessForm(instance=item) return render(request, 'addbutton.html', {'form': form})
第二步:给表格数据添加状态标记
在secondpage视图里,我们需要给每个BAReg对象添加一个属性,标记它是否已经关联了ProcessReg记录,这样表格模板就能直接用这个状态判断:
def secondpage(request): ba = request.session.get('ba') # 获取要展示的BAReg记录 bar_regs = BAReg.objects.filter(regulation=ba) # 给每个记录添加has_process属性 for reg in bar_regs: # 判断是否存在对应的ProcessReg条目 reg.has_process = ProcessReg.objects.filter(ba=reg.ba, regulation=reg.regulation).exists() table = PersonTable(bar_regs) RequestConfig(request).configure(table) context = {'table': table} # 注意去掉模板路径末尾的斜杠,否则会找不到模板 return render(request,'secondpage.html', context)
第三步:修改表格类,实现动态渲染列内容
把原来固定的LinkColumn改成TemplateColumn,这样我们可以自定义每个单元格的内容,根据has_process状态显示按钮或者“Done”文本:
class PersonTable(tables.Table): Process = tables.TemplateColumn(''' {% if record.has_process %} <span class="text-success fw-bold">Done</span> {% else %} <a href="{% url 'edit_item' record.pk %}" class="btn btn-primary">Add Process</a> {% endif %} ''') class Meta: model = BAReg template_name = 'django_tables2/bootstrap4.html'
这里用了Bootstrap的样式类让“Done”文本更醒目,你可以根据自己的页面风格调整样式。
这样修改后,当用户提交Process并返回表格页面时,对应的行就会自动显示“Done”而不是按钮啦!如果之后需要支持重新编辑,还可以扩展逻辑,比如当存在ProcessReg时显示“Edit Process”按钮,当前需求这样调整就完全够用。
内容的提问来源于stack exchange,提问作者Vinaykumar Chalamalla
相关产品推荐
相关产品推荐

