Django如何实现点击新窗口按钮更新数据库后关窗口并刷新主页面
告警功能修复方案
你不需要单独开发alert_update.html,提交更新操作后直接返回JS脚本执行即可,以下是全流程修正方案:
代码修正步骤
1. 修正forms.py
当前表单类继承错误,要关联模型的表单需要继承ModelForm而非普通Form:
from django import forms from .models import Event class EventStatusForm(forms.ModelForm): class Meta: model = Event fields = ('event_status',)
2. 修正alert_list.html,确保点击告警打开新窗口
给a标签添加target="_blank"属性,同时修复遍历数字报错的问题:
{% for event_alert in event_list %} {% if event_alert.event_status == 1 %} <div class="col-1 red"> <div class="p-3 rounded-2" id="dash_board_patient_alert"> <!-- 加target="_blank"实现新窗口打开详情 --> <a href="{% url 'Alert Detail' event_alert.event_id %}" target="_blank">{{event_alert.member_id}} {{event_alert.event_type}}</a> </div> </div> {% endif %} {% endfor %} {{event_alert_activate_count}} {% for _ in "x"|rjust:pink_block %} <div class="col-1 pink"> <div class="p-3 rounded-2" id="dash_board_patient_alert"> <a href="#"></a> </div> </div> {% endfor %}
注:原代码直接遍历int类型的
pink_block会报错,上面用"x"|rjust:pink_block生成指定长度的字符串,实现循环12次的需求。
3. 修正alert_detail.html
你已经在详情视图里传入了单条event对象,不需要循环event_list,也不需要给用户展示event_status输入框,直接删除表单里的{{ form }}即可:
<form method="POST" class="post-form" action="{% url 'Alert Update' event.pk %}"> {% csrf_token %} <button type="submit" class="btn btn-primary" id="patient_alert_result_confirm"> Confirm </button> </form>
4. 重写alertUpdate视图逻辑
原视图逻辑存在未绑定表单实例、JS逻辑不适用新窗口场景的问题,修正后如下:
from django.shortcuts import get_object_or_404, redirect from django.http import HttpResponse from .models import Event def alertUpdate(request,pk): event = get_object_or_404(Event, pk=pk) if request.method == "POST": # 直接修改告警状态保存即可,不需要额外表单校验 event.event_status = 0 event.save() # 返回JS逻辑:先刷新父级告警列表页,再关闭当前新窗口 return HttpResponse('<script>window.opener.location.reload();window.close();</script>') # 非POST请求直接跳回告警列表页 return redirect('Alert List')
说明:更新操作执行完直接返回JS脚本执行前端操作即可,不需要渲染额外的
alert_update.html页面。
内容的提问来源于stack exchange,提问作者김민수
相关产品推荐
相关产品推荐

