如何配置Django以在APP路由下正确访问项目根目录的媒体文件夹资源
嘿,我一眼就瞅出问题出在哪了!你碰到的404错误,核心原因是模板里引用媒体文件的方式不对,导致浏览器从当前APP路由路径下去找文件,而不是咱们配置好的/media/路径。
问题根源拆解
你在模板里写的是 <img src="{{ hrac.fotka }}" />,这里的{{ hrac.fotka }}输出的只是数据库里存的相对路径pic/hraci/download_6BVC8qn.jpeg。当你在/soupiska/这个APP路由页面时,浏览器会把这个路径解析成相对当前页面的路径——也就是/soupiska/pic/hraci/download_6BVC8qn.jpeg,但你的媒体文件明明存在项目根目录的media/文件夹下,这不就找不到了嘛!
一步步解决问题
1. 模板里用正确的媒体文件URL
把模板里的图片引用改成下面这样:
<th><img src="{{ hrac.fotka.url }}" /></th>
{{ hrac.fotka.url }}会自动拼接你配置的MEDIA_URL,最终输出完整的正确路径:/media/pic/hraci/download_6BVC8qn.jpeg。这样不管你在哪个APP路由下,浏览器都会直奔正确的/media/路径找文件。
2. 确认模型字段配置(可选但关键)
确保你的模型里的fotka字段是ImageField或FileField,并且设置了正确的upload_to参数,比如:
from django.db import models class Hrac(models.Model): # 其他字段... fotka = models.ImageField(upload_to='pic/hraci/', blank=True, null=True)
这样上传的文件会自动存到MEDIA_ROOT/pic/hraci/目录下,和数据库里的路径完全对应。
3. 优化MEDIA配置(可选)
你的settings.py和urls.py配置其实已经没问题了,但可以把MEDIA_ROOT的写法换成Django推荐的pathlib格式,更简洁:
# settings.py from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media' # 替代os.path.join的写法
另外要提醒下:urls.py里的静态媒体服务配置只适合开发环境,生产环境记得用Nginx或Apache来托管媒体文件哦。
4. 顺手修复favicon的小问题
模板里的<link rel="icon" href="./favicon.ico" />也是相对路径,同样会在APP路由下找不到。建议把favicon放到静态文件目录(比如static/),然后用Django的静态文件标签引用:
{% load static %} <link rel="icon" href="{% static 'favicon.ico' %}" type="image/x-icon" />
验证效果
改完模板后刷新页面,浏览器应该会请求/media/pic/hraci/download_6BVC8qn.jpeg,这个路径正好对应你media/文件夹里的文件,404错误就彻底消失啦!
备注:内容来源于stack exchange,提问作者Libor P

