Django报Directory indexes not allowed报错PDF预览失败解决方案
Django 点击预览PDF报「Directory indexes are not allowed here」修复方案
报错根因
这个报错是请求的静态/上传文件路径不正确,Django找不到对应文件,且默认禁止目录索引返回的错误,你的代码存在3个核心问题:
- 视图传参和模板取值不匹配:
ppts视图传给模板的单条学生记录变量是b,但ppts.html里取值用的是{{a.resume}},变量不匹配会导致渲染出来的文件路径为空 - static标签用法错误:
{% static ' ' %}{{a.resume}}的写法会在路径开头拼接一个多余空格,最终请求路径直接指向静态资源根目录,触发目录索引禁止的报错 - 资源类型混用:简历类用户上传的文件属于media资源,不属于项目内置的static静态资源,用static标签处理本身就无法正确定位文件
分步修复
1. 修正视图层变量传递
把views.py里的ppts函数调整为语义更清晰的变量名,避免模板取值写错:
def ppts(request, id): stu = student.objects.get(id=id) return render(request, 'ppts.html', {'stu': stu})
2. 配置用户上传文件(media)的访问路由
如果resume字段是用户上传的文件,按下面的步骤配置:
- 在settings.py末尾添加media配置:
import os MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- 在项目根urls.py中添加开发环境下的media文件服务映射:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 此处保留你原有的所有路由配置 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
注意:上述media路由配置仅适用于本地开发环境,生产环境需要用Nginx等Web服务直接托管static和media目录,不要让请求走Django服务处理
3. 修正模板中的PDF引用路径
把ppts.html里原来错误的embed标签替换为下面的写法,直接用模型文件字段的url属性获取访问地址,不要手动拼接路径:
<!-- 确保stu和视图里传的变量名一致 --> <embed src="{{ stu.resume.url }}" height="700px" width="1500px">
如果你的PDF是提前存在static目录下的固定资源,不要用空格拼接路径,正确写法如下:
<embed src="{% get_static_prefix %}{{ stu.resume }}" height="700px" width="1500px">
4. 修复其他代码笔误
- show.html里viewport标签属性写错:把
content="width=>, initial-scale=1.0"改成content="width=device-width, initial-scale=1.0" - ppts.html里单独放置
<td>不符合HTML语法规范,需要外层包裹<table><tr></tr></table>结构,否则浏览器会出现渲染异常
验证方式
修改完成后清除浏览器缓存,点击列表的预览按钮,右键查看embed标签的src属性,把地址复制到新标签页能直接打开PDF的话,就说明路径配置正确,预览功能可以正常使用。
内容的提问来源于stack exchange,提问作者barot poojan
相关产品推荐
相关产品推荐

