Django项目中MEDIA_URL无法展示media文件夹内PDF链接问题求助
问题根因排查&修复方案
- 前端模板逻辑错误:当前仅判断了
MEDIA_URL是否存在,没有读取并遍历media目录下的实际PDF文件,且MEDIA_URL只要配置就会有值,会导致else分支永远无法触发,也无法渲染单个PDF的访问链接 - 视图层数据传递缺失:没有把media目录下的PDF文件列表、
MEDIA_URL注入到模板上下文,模板没有对应数据自然无法渲染链接 - 路由配置不规范:
br路径末尾未加斜杠,Django默认会对末尾无斜杠的路径做301重定向,可能导致资源路径拼接异常
1. 修正views.py代码
import os from django.conf import settings from django.core.files.storage import FileSystemStorage def upload(request): # 读取media目录下所有PDF文件 pdf_files = [] media_path = settings.MEDIA_ROOT if os.path.exists(media_path): for file_name in os.listdir(media_path): if file_name.lower().endswith('.pdf'): pdf_files.append(file_name) if request.method == 'POST' and request.FILES.get('upload'): upload = request.FILES['upload'] fss = FileSystemStorage() file = fss.save(upload.name, upload) file_url = fss.url(file) # 上传后刷新PDF文件列表 if upload.name.lower().endswith('.pdf'): pdf_files.append(upload.name) return render(request, 'website/upload.html', { 'file_url': file_url, 'pdf_files': pdf_files, 'MEDIA_URL': settings.MEDIA_URL }) return render(request, 'website/upload.html', { 'pdf_files': pdf_files, 'MEDIA_URL': settings.MEDIA_URL })
2. 修正前端模板代码
<h1 class="my-4">Batch Records</h1> <div class="row"> {% if pdf_files %} <div class="col-lg-4 col-md-6 col-sm-12 pb-4"> <p>Uploaded PDFs:</p> <ul> {% for pdf in pdf_files %} <li><a href="{{ MEDIA_URL }}{{ pdf }}" target="_blank">{{ pdf }}</a></li> {% endfor %} </ul> <a class="btn btn-dark my-4" href="/">Return to Homepage</a> </div> {% else %} <p>No records added.</p> {% endif %} </div>
3. 修正urls.py路由配置
urlpatterns = [ path("br/", views.upload, name="upload") ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
额外校验项
- 确认当前运行环境为调试模式(
DEBUG = True),生产模式下Django默认不处理静态/media资源,需要搭配Nginx等反向代理服务实现资源访问 - 确认项目media目录及内部PDF文件具备可读权限,PDF文件本身无损坏
内容的提问来源于stack exchange,提问作者Nick Rizzolo
相关产品推荐
相关产品推荐

