如何在Django同一操作中获取数据后删除并在模板显示?
问题解决:Django获取数据后删除但模板无法显示的问题
问题原因
你遇到的问题核心是Django QuerySet的惰性求值特性:当你执行Plan.objects.filter(id=6)时,并没有立刻查询数据库,而是生成了一个待执行的查询对象。直到模板渲染时才会真正去数据库取数据,但此时你已经提前删除了这条记录,自然拿不到数据显示。
解决方案
先把数据加载到内存中(比如转换为列表、用get()获取单个对象),再删除数据库中的记录,这样内存里保留的数据可以正常传给模板渲染。
针对单个指定ID的场景(你的示例)
修改views.py代码如下:
def Data(request): # 先获取对象并加载到内存,处理不存在的情况避免报错 try: data = Plan.objects.get(id=6) except Plan.DoesNotExist: data = None # 删除数据库中的对应记录 Plan.objects.filter(id=6).delete() context = {'data': data} return render(request, 'data.html', context)
针对获取第一条数据即删除的场景(你注释里的需求)
如果是要每次取第一条数据并删除,代码可以改成:
def Data(request): # 获取第一条数据的查询集 queryset = Plan.objects.all().order_by('id')[:1] # 转换为列表,强制执行数据库查询加载到内存 data = list(queryset) # 删除数据库中的对应记录 queryset.delete() context = {'data': data} return render(request, 'data.html', context)
模板渲染示例
如果是单个对象,模板data.html中可以这样显示:
{% if data %} <p>{{ data.Comments }}</p> {% else %} <p>暂无数据</p> {% endif %}
如果是列表(多条数据场景),用循环渲染:
{% for item in data %} <p>{{ item.Comments }}</p> {% empty %} <p>暂无数据</p> {% endfor %}
内容的提问来源于stack exchange,提问作者Ishtiak Fahim
相关产品推荐
相关产品推荐

