如何在Django中实现类似Django Admin的保存添加与保存继续功能
实现Django表单的“Save & Add”和“Save & Continue”按钮功能
先修正模板和视图中的问题,以下是分步优化方案:
1. 修正模板语法错误
你的模板中表单渲染标签写法有误,Django模板变量需要用双大括号包裹,把:
{form | crispy}
改为:
{{ form|crispy }}
完整修正后的表单代码:
<form method='POST' enctype='multipart/form-data'> {% csrf_token %} {{ form|crispy }} <div class="form-group"> <button type="submit" name="save_add" class="btn btn-de-primary btn-sm text-light px-4 mt-3 mb-0">Save & Add</button> <button type="submit" name="save_continue" class="btn btn-de-danger btn-sm text-light px-4 mt-3 mx-4 mb-0">Save & Continue</button> <a href="{% url 'doctor:list_doctor' %}" class="btn btn-de-success btn-sm text-light px-4 mt-3 mb-0" type="button">Close</a> </div> </form>
2. 优化视图逻辑
你的视图存在代码冗余、跳转逻辑和Django Admin功能不符的问题,同时需要补充全场景的成功提示,修正后的代码如下:
from django.contrib import messages from django.shortcuts import render, redirect from .forms import DoctorForm def addDoctor(request): if request.method == 'POST': form = DoctorForm(request.POST, request.FILES) if form.is_valid(): # 无额外字段修改时,直接保存表单即可 doctor = form.save() success_msg = f"Doctor {doctor.name} successfully added" # 根据点击的按钮执行对应操作 if 'save_add' in request.POST: # Save & Add:保存后跳转到新的空白添加页面(对齐Django Admin的Save and add another) messages.success(request, success_msg) return redirect('doctor:add_doctor') elif 'save_continue' in request.POST: # Save & Continue:保存后跳转到刚创建医生的编辑页面(对齐Django Admin的Save and continue editing) messages.success(request, success_msg) # 假设你有编辑医生的URL,命名为edit_doctor,参数为pk return redirect('doctor:edit_doctor', pk=doctor.pk) # 默认情况:跳转到医生列表页 messages.success(request, success_msg) return redirect('doctor:list_doctor') else: form = DoctorForm() context = {'form': form} return render(request, 'doctor/add_doctor.html', context)
关键说明
- 按钮判断逻辑:通过检查
request.POST中是否存在按钮的name属性值,直接区分用户操作,比request.POST.get()更简洁可靠。 - 对齐Django Admin功能:
Save & Add:保存当前条目后跳转至空白添加页,支持连续添加多个医生;若你需要跳转到列表页,可把对应跳转改回redirect('doctor:list_doctor')。Save & Continue:保存后跳转至刚创建医生的编辑页,方便立即修改内容;若需求是留在添加页,可将跳转改为redirect('doctor:add_doctor')。
- 消息提示:所有保存成功的场景都添加了提示信息,用户能直观确认操作结果。
- 表单保存优化:无需额外修改字段时,直接调用
form.save()即可,省去commit=False的冗余步骤。
内容的提问来源于stack exchange,提问作者Lodyne Mark
相关产品推荐
相关产品推荐

