Django QuerySet查询结果正确但模板无法显示数据如何解决?
核心问题排查&修复方案
存在4处可直接导致空模板的问题,修复后即可正常展示数据:
- 上下文变量名不匹配:视图
search_results_primers传递给模板的变量名为query,但模板中迭代使用的变量名为result,变量名不对应导致循环无法执行 - 跳转逻辑错误:
filter_primers视图表单验证通过后直接渲染结果模板,没有触发search_results_primers的查询逻辑,返回的是无数据的空模板 - 参数获取逻辑冗余:
search_results_primers中从GET参数读取搜索词,但搜索词实际已经存储在session中,不需要依赖GET参数传递 - 模板标签笔误:模板中
<tbody>的结束标签误写为</body>,可能导致页面渲染异常
修改后的代码参考
1. filter_primers视图调整
from django.shortcuts import redirect # 顶部导入重定向方法 def filter_primers(request): filter_by = request.session.get('filter_by') if request.method == "POST": form = FilterPrimerForm(request.POST) if form.is_valid(): request.session['contains'] = form.cleaned_data.get("contains") # 重定向到搜索结果视图对应的路由,不要直接渲染模板 return redirect('search_results_primers') # 替换为你路由配置中search_results_primers对应的名称 else: return render(request, 'lab_inventory/choose_filter_primers.html') else: form = FilterPrimerForm() context = {'form': form} return render(request, 'lab_inventory/filter_primers.html', context)
2. search_results_primers视图调整
def search_results_primers(request): # 直接从session读取参数,不需要从GET参数获取 search_term = request.session.get('contains') filter_by = request.session.get('filter_by') result = {'result': []} if filter_by == 'primer_name' and search_term: query = Primer.objects.filter(primer_name__contains=search_term).values() # 上下文变量名和模板保持一致 result['result'] = query return render(request, 'lab_inventory/search_results_primers.html', result)
3. 模板片段调整
<table id="search-results-primers-table"> <tr> <th>Primer Name</th> <th>Primer Sequence</th> <th>Purchase Order</th> <th>Date Received</th> <th>Date Opened</th> <th>Date Discarded</th> <th>Freezer / Shelf</th> <th>Box / Position</th> </tr> <tbody> {% for item in result %} <tr> <td>{{ item.primer_name }}</td> <td>{{ item.primer_seq }}</td> <td>{{ item.purchase_order }}</td> <td>{{ item.date_received }}</td> <td>{{ item.date_opened }}</td> <td>{{ item.date_discarded }}</td> <td>{{ item.stored_freezer }}</td> <td>{{ item.stored_box }}</td> </tr> {% endfor %} </tbody> <!-- 修正之前的</body>错误标签 --> </table>
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

