Django可找到模板但不渲染,返回空白HTML页问题排查求助
问题原因
- 模板继承规则使用错误:使用
{% extends "base.html" %}继承父模板时,子模板内所有需要展示的内容必须放在对应block标签内,你当前把<h1>H</h1>写在{% block content %}外部,这部分内容不会被渲染;如果父模板base.html没有定义{% block content %}占位块,子模板内的content块内容也不会被输出。 - 模板引用不存在的路由:模板内
{% url 'home' %}引用了名为home的路由,若项目中没有对应命名的路由,会触发NoReverseMatch错误,若settings.py中DEBUG = False,错误会被静默,直接返回空白页面。 - 视图逻辑存在隐患:POST请求判断逻辑使用
request.FILES['myfile']直接取值,若POST请求未携带myfile参数会抛出KeyError,DEBUG关闭时同样会返回空白。 - 路由匹配顺序错误:如果
path('<int:pk>/')的路径参数类型不是int(比如改为str、slug等),Django会从上到下匹配路由,访问upload/时会优先匹配到参数路由,若对应视图返回空白内容也会导致该问题。
解决方法
- 修正模板结构,调整内容到对应
block内,确认父模板存在对应占位块:
{% extends "base.html" %} {% load static %} {% block content %} <h1>H</h1> <form method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="myfile"> <button type="submit">Upload</button> </form> {% if uploaded_file_url %} <p>File uploaded at: <a href="{{ uploaded_file_url }}">{{ uploaded_file_url }}</a></p> {% endif %} <p><a href="{% url 'project_index' %}">Return to home</a></p> {% endblock %}
注意将模板中的路由引用替换为你项目中实际存在的路由名称,示例中替换为了已定义的project_index。
- 修正视图判断逻辑,避免取值异常:
def simple_upload(request): if request.method == 'POST' and 'myfile' in request.FILES: myfile = request.FILES['myfile'] fs = FileSystemStorage() filename = fs.save(myfile.name, myfile) uploaded_file_url = fs.url(filename) context = { 'uploaded_file_url': uploaded_file_url } return render(request, 'simple_upload.html', context) return render(request, 'simple_upload.html')
- 调整路由顺序,把无参数的
upload/路由放在带参数的路由前面,避免被参数路由优先匹配:
urlpatterns = [ path('', views.project_index, name='project_index'), path('upload/', views.simple_upload, name='upload'), path('<int:pk>/', views.project_detail, name='project_detail') ]
- 开发阶段在
settings.py中设置DEBUG = True,可直接显示报错信息,快速定位具体问题。
内容的提问来源于stack exchange,提问作者Arseniy Koshelnik
相关产品推荐
相关产品推荐

