Django详情页模板变量无法显示问题求助
问题
刚开启Django学习之旅,遇到了模板变量无法显示的问题。想要实现首页展示所有建筑的列表链接,点击后进入对应建筑的详情页。
目前首页能正常展示数据库中的所有建筑列表,点击链接可进入详情页,但详情页仅显示静态文本,无法渲染Build模型的变量。测试使用HttpResponse能正确显示对应的build_id,但模板变量始终无输出,请问哪里出错或遗漏了什么?
相关代码
models.py
class Build(models.Model): building_name = models.CharField( max_length=50) address = models.CharField(max_length = 100) #other details
views.py
from django.shortcuts import render from django.shortcuts import get_object_or_404 from django.http import HttpResponse from .models import Build def home(request): builds = Build.objects.all() return render(request, 'Home.html', {'builds':builds,}) def building_detail(request,build_id): #return HttpResponse(f'<p> building number {build_id}</p>') build = get_object_or_404(Build, id=build_id), return render(request, 'Building_detail.html', {'build':build,})
urls.py
from django.contrib import admin from django.urls import path from Buildings import views urlpatterns.py = [ path('admin/', admin.site.urls), path('', views.home, name='home'), path('buildings/<int:build_id>/', views.building_detail, name= 'building_detail'), ]
Home.html
<p>Home view from template</p> <div> {% for build in builds %} <div class="buildingname"> <a href="{% url 'building_detail' build.id %}"> <h3>{{build.building_name|capfirst}}</h3> </a> </div> {% endfor %} </div>
Building_detail.html
<div> <h3>{{build.building_name|capfirst}}</h3> <p>building view from template is this working</p> <h3>does this {{build.building_name|capfirst}} work</h3> <p>{{build.address}} </div>
问题原因与解决办法
核心错误
views.py中building_detail函数的这一行末尾多了一个逗号:
build = get_object_or_404(Build, id=build_id),
这个逗号会让build变量变成一个元组(包含单个Build对象的元组),而不是预期的Build实例。模板中尝试访问build.building_name时,实际上是在访问元组的属性,元组没有这些属性,因此无法渲染出内容。
修正步骤
- 去掉
views.py中那行的末尾逗号,修改后代码:
def building_detail(request,build_id): #return HttpResponse(f'<p> building number {build_id}</p>') build = get_object_or_404(Build, id=build_id) return render(request, 'Building_detail.html', {'build':build,})
- 同时修正
urls.py中的笔误:将urlpatterns.py = [改为urlpatterns = [,否则URL配置会失效:
urlpatterns = [ path('admin/', admin.site.urls), path('', views.home, name='home'), path('buildings/<int:build_id>/', views.building_detail, name= 'building_detail'), ]
修改完成后,重新运行服务,详情页的模板变量就能正常渲染了。
内容的提问来源于stack exchange,提问作者Matt Body
相关产品推荐
相关产品推荐

