django中图像上传(文件上传)的配置
一、settings配置
- MEDIA_URL= "/media/" # 可以换成你自己的
这个是生成URL用的。如果你的数据库中存的图像假设是:img/test.png,那么生成的URL: /media/img/test.png。 - MEDIA_ROOT = BASE_DIR / 'media' #
这个是图片上传的根目录。如果你在ImageField或者FileField中设置了upload_to属性(假设你设置为img),那么django将会把文件上传到: BASE_DIR /media/img下。 - 'django.template.context_processors.media'
配置了这两个选项之外,你还得在TEMPLATES的'OPTIONS'中添加上面这个'context_processors',加上之后大约是这个样子的:
TEMPLATES = [
{
# 跟本问题无关的我删去了
'OPTIONS': {
'context_processors': [
# 跟本问题无关的我删去了
'django.template.context_processors.media',
],
},
},
]
只有添加了这个,你才可以在模板文件中使用{{ MEDIA_URL }}
二、路由问题
完成了上面的配置,还是不能访问图片文件。因为还没有路由。网络上很多人是用url添加路由,大约是这个样子,
高版本的可以用 re_path。
url(r'^media/(?P.*)$, serve, {
'document_root': settings.MEDIA_ROOT,
})
还有人在patterns后加上下面的代码,大概都可以工作。:
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
可是不知道是什么原理。
三、研究后终于想通了
通过将加上+static后的patterns打印出来:
[, , .*)$'>]
突然明白:static也不过是生成了个URL,+也就是两个数组的加操作。
生成的URL是以settings.MEDIA_ROOT为参照的。实际上主是:MEDIA_URL和MEDIA_ROOT建立了一种对应关系。
和MEDIA_URL相关的URL都去MEDIA_ROOT下去找文件。