1、说明
比如当我们开发了一个系统,可以允许用户上传头像图片或者视频之类的,对这些媒体文件进行保存时就可以使用MEDIA了,
它指定保存在哪里,需要将保存的路径添加到路由中,我们就可以在浏览器的地址栏根据media文件夹中文件的路径访问对应的文件了。
2、设置MEDIA
1)设置settings.py
# 配置用户上传文件存放位置(相当于暴露一个url, 用此方法也可以暴露其他文件夹) # 用户上传的文件会自动存放到media文件夹下,此文件夹不用手动创建 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
2)设置urls.py
from django.views.static import serve # 导入相关静态文件处理的views控制包 from BBS import settings # 导入项目文件夹中settings urlpatterns = [ ...... # 手动配置media文件路径 url(r'^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT}), ]
3)前端渲染,比如要展示头像
<img src='/media/{{user_obj.avatar}}/'/>
3、关于media中文件存储
我们在models.py中写建表语句时,其实在头像字段上指定了要存储的目录,如下:
# 用户表 class UserInfo(AbstractUser): phone = models.BigIntegerField(null=True, blank=True) # blank=True:告诉Django的后台管理,该字段可以为空 create_time = models.DateField(auto_now_add=True) # upload_to='avatar/':会把用户上传的文件,存在一个叫avatar的目录下(必须是“相对路径”, 不能是/avatars/) # default='avatar/default.png':用户未上传头像时的默认用户头像 avatar = models.FileField(upload_to='avatar/',default='avatar/default.png') blog = models.OneToOneField(to='Blog',null=True),
上面我们指定了头像存储的目录,我们在项目目录下新建一个avatar目录,用户上传的头像就会存到avatar里,
但是当我们又指定了MEDIA后,我们上传的头像就会存到/media/avatar下,而且所有目录会自动创建;
比如我们想要查看default.png,在浏览器中输入:http://ip:port/media/avatar/default.png 就可以显示了;
实际中,用户不可能去地址栏输入文件路径的,那么是否有一种方法能够让用户仅仅点击一下就能查看到对应的文件呢?
答案是有的;
接下来看media的一个参数:MEDIA_URL
4、MEDIA_URL
在使用MEDIA_URL之前我们需要新增一条中间件,在settings.py文件的TEMPLATES参数中加入中间件:
django.template.context_processors.media
然后我们在settings.py中加入MEDIA_URL的参数:
MEDIA_URL = '/media/'
接着在urls.py中新增一条测试路由:
url('aa/bb',views.aa),
视图函数:
def aa(request): return render(request,'aa.html')
aa.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <a href="{{ MEDIA_URL }}avatar/222.png">查看media目录下的一张图片</a> <p>MEDIA_URL: {{ MEDIA_URL }}</p> </body> </html>
点击链接就可以显示图片: