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

Django:如何点击按钮不跳转URL打开小窗口提交表单并保存数据?

Django 无跳转弹出表单提交实现方案

该需求需要搭配JS实现无跳转交互,若你项目已引入Bootstrap可直接使用自带模态框组件,无需额外引入依赖


步骤1:替换原跳转按钮

将原跳转a标签替换为模态框触发按钮,同时将患者ID存入按钮自定义属性供后续提交使用:

<!-- Bootstrap 5 版本写法,若使用Bootstrap3,将data-bs-*替换为data-*即可 -->
<button type="button" class="btn btn-primary" 
        data-bs-toggle="modal" 
        data-bs-target="#chirurgieModal" 
        data-patient-id="{{ patients.id }}">
  Nouvelle Chirurgie
</button>

步骤2:模板新增模态框表单

在当前页面模板任意位置添加模态框DOM,内部放置你业务需要的表单字段:

<div class="modal fade" id="chirurgieModal" tabindex="-1" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">新增手术记录</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <form id="chirurgieForm">
        {% csrf_token %}
        <div class="modal-body">
          <!-- 以下表单字段可根据你的实际业务需求调整,和原有register_visit页面字段保持一致即可 -->
          <div class="mb-3">
            <label class="form-label">手术名称</label>
            <input type="text" class="form-control" name="surgery_name" required>
          </div>
          <div class="mb-3">
            <label class="form-label">手术时间</label>
            <input type="date" class="form-control" name="surgery_date" required>
          </div>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
          <button type="submit" class="btn btn-primary">保存</button>
        </div>
      </form>
    </div>
  </div>
</div>

步骤3:添加JS交互逻辑

在模板底部添加JS代码,实现模态框数据传递、无刷新表单提交:

<script>
// 模态框打开时获取对应患者ID
const chirurgieModal = document.getElementById('chirurgieModal')
let currentPatientId = null
chirurgieModal.addEventListener('show.bs.modal', e => {
  currentPatientId = e.relatedTarget.getAttribute('data-patient-id')
})

// 监听表单提交事件
document.getElementById('chirurgieForm').addEventListener('submit', e => {
  e.preventDefault() // 阻止默认表单跳转
  const formData = new FormData(this)

  // 发送AJAX请求
  fetch(`/register_visit/${currentPatientId}/`, { // 也可以用{% url 'register_visit' 0 %}.replace('0', currentPatientId) 生成路径
    method: 'POST',
    body: formData,
    headers: {
      'X-Requested-With': 'XMLHttpRequest' // 标记为AJAX请求
    }
  })
  .then(res => res.json())
  .then(data => {
    if(data.status === 'success') {
      // 保存成功后关闭模态框、重置表单,可自行添加页面局部更新逻辑
      bootstrap.Modal.getInstance(chirurgieModal).hide()
      this.reset()
      alert('保存成功')
    } else {
      alert('保存失败:' + data.msg)
    }
  })
  .catch(err => alert('请求出错,请重试'))
})
</script>

步骤4:修改视图适配AJAX请求

调整原register_visit视图逻辑,支持接收AJAX请求并返回JSON响应:

from django.http import JsonResponse
from .models import Visit # 替换为你自己的业务模型
from .forms import VisitForm # 若你使用Django Form则引入,否则可忽略

def register_visit(request, patient_id):
    # 处理AJAX POST请求
    if request.method == 'POST' and request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest':
        # 如果你使用Django Form,可直接校验保存
        form = VisitForm(request.POST)
        if form.is_valid():
            visit = form.save(commit=False)
            visit.patient_id = patient_id # 关联对应患者
            visit.save()
            return JsonResponse({'status': 'success', 'msg': '保存成功'})
        else:
            return JsonResponse({'status': 'error', 'msg': form.errors.as_json()})
        
        # 如果你不使用Django Form,手动取值保存即可
        # surgery_name = request.POST.get('surgery_name')
        # surgery_date = request.POST.get('surgery_date')
        # Visit.objects.create(
        #     patient_id=patient_id,
        #     surgery_name=surgery_name,
        #     surgery_date=surgery_date
        # )
        # return JsonResponse({'status': 'success', 'msg': '保存成功'})
    
    # 原有的非AJAX请求逻辑可以保留,不影响原有功能使用
    # 原有视图代码...

注意事项

  • 保存成功后如果需要实时更新页面上的手术记录列表,可在AJAX请求成功的回调中手动操作DOM更新,无需刷新整个页面
  • 若你的项目未引入Bootstrap,可自行用原生JS实现弹出层逻辑,AJAX提交部分和视图层逻辑保持一致即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:06:03