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下去找文件。

四、在测试的时候一定要不断清理缓存,不然效果可能受影响。而你可能一直在正确的代码中寻找错误。