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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:50:16