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

Django执行增删改操作后重定向页面不显示数据如何解决

问题现象
  • 在Django框架中执行新增(add)、编辑(edit)、删除(delete)操作后,可正常跳转至预期页面,但页面无法展示最新的已有数据
  • 仅当手动点击浏览器地址栏按下回车,或跳转至其他页面再返回该页面时,数据才会正常显示
问题成因

核心问题是增删改操作的视图逻辑违反了HTTP规范与Django通用设计模式,具体原因如下:

  • 未遵循*Post/Redirect/Get(PRG)*模式:所有执行数据修改的视图,在操作完成后直接调用render返回页面,没有触发重定向让浏览器重新发起列表页的GET请求。以提供的删除视图为例,AddContact.objects.filter(id=id).delete()的返回值是包含删除条目数、各模型删除数量统计的元组,根本不是页面渲染需要的全量联系人数据集,直接把这个值传入上下文渲染模板,自然拿不到要展示的列表数据。
  • 浏览器缓存机制影响:直接通过GET请求触发数据修改后,浏览器对当前URL的页面缓存未失效,不会主动拉取最新数据;手动回车刷新、跨页返回时,浏览器才会发起完整的新请求,拿到最新数据完成渲染。
  • 存在额外隐患:用a标签的GET请求触发删除/修改操作不符合HTTP方法语义,极易被误触发,也存在CSRF攻击风险。
  • 新增、编辑操作出现相同表现的成因完全一致,均为操作完成后直接渲染页面、未走重定向逻辑导致。
修复方案

1. 修正所有增删改视图逻辑,严格遵循PRG模式

所有执行数据写入、修改、删除的视图,操作完成后不要直接render页面,统一调用redirect跳转到对应列表页的路由,引导浏览器自动发起新的GET请求拉取最新的全量数据。
以删除功能为例,修正后的views.py代码如下:

from django.shortcuts import redirect, get_object_or_404
from .models import AddContact

def deleteuser(request, id):
    # 先校验待删除对象是否存在,不存在直接返回404
    contact = get_object_or_404(AddContact, id=id)
    # 仅接受POST请求执行删除操作,阻断GET误触发
    if request.method == "POST":
        contact.delete()
    # 操作完成后重定向到联系人列表页,将路由name替换为你项目中实际的列表页路由名
    return redirect("adduser_list")

新增、编辑视图按相同逻辑调整,操作完成后统一重定向到列表页即可。

2. 优化路由配置

原路由的路径参数未指定类型,容易出现匹配异常,修正后的urls.py配置参考:

from django.urls import path
from . import views

urlpatterns = [
    # 其余业务路由...
    path('deleteuser/<int:id>', views.deleteuser, name="deleteuser"),
]

3. 调整前端删除触发逻辑,禁止用GET请求执行数据修改

将原来直接发GET请求的a标签删除按钮,替换为POST表单提交,同时加上Django自带的CSRF令牌,避免安全风险:

{% for vr in adduser.adduser.all %}
<form action="{% url 'deleteuser' vr.id %}" method="POST" style="display: inline;">
    {% csrf_token %}
    <button type="submit" class="btn btn-danger">
        <span class="fa fa-trash"></span> Delete
    </button>
</form>
{% endfor %}

新增、编辑的表单提交方法统一设置为POST,不要用GET提交修改类请求。

4. 校验列表页视图的上下文传值

确保负责渲染adduser.html的列表页视图,正确将页面需要的全量联系人数据传入上下文,不要依赖增删改视图传递列表数据。参考列表页视图代码:

def adduser_list(request):
    # 查询所有需要展示的联系人数据
    contact_list = AddContact.objects.all()
    context = {
        # 按照你模板的变量结构调整键名,保证模板循环能正确取到数据
        "adduser": contact_list
    }
    return render(request, "adduser.html", context)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:18:19