首先,我将解释"MEDIA_ROOT"和"MEDIA_URL"。
<MEDIA_ROOT>
"MEDIA_ROOT"设置上传文件存储的绝对路径目录,设置" MEDIA_ROOT "绝不会影响媒体文件的URL。
例如,我们有一个Django项目:
![enter image description here](https://istack.dev59.com/ofrcD.webp)
然后,我们将在我的Windows电脑上设置为"C:\Users\kai\django-project\media"的
"os.path.join(BASE_DIR, 'media')"赋值给
"MEDIA_ROOT":
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
将下面的代码设置到 "urls.py" 中:
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
并将模型“Image”设置如下:
class Image(models.Model):
image = models.ImageField()
def __str__(self):
return str(self.image)
将以下代码设置到
"admin.py" 文件中:
from .models import Image
admin.site.register(Image)
然后,上传
文件"orange.jpg":
![enter image description here](https://istack.dev59.com/z9YvO.webp)
然后,在与 "db.sqlite3" 和 "manage.py" 同级的位置创建了一个名为"media" folder的文件夹,它是在django项目根目录下方,上传的文件 "orange.jpg" 存储在下面所示的 "media" 文件夹中:
![enter image description here](https://istack.dev59.com/IeaZD.webp)
然后,上传更多文件:
![enter image description here](https://istack.dev59.com/Ct0mz.webp)
此外,我们可以通过在“更改图像”页面上单击下面所示的“orange.jpg”来显示文件“orange.jpg”。请参考以下内容:
![enter image description here](https://istack.dev59.com/WHVoX.webp)
然后,
文件 "orange.jpg" 如下所示显示:
![enter image description here](https://istack.dev59.com/V5ko6.webp)
请注意,如果您从 "urls.py" 中删除下面的代码:
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
然后,
文件"orange.jpg"没有显示。相反,会出现以下错误:
![enter image description here](https://istack.dev59.com/Ptlbz.webp)
下一步,您可以将上传的文件存储在
更多子目录下,我将介绍两种方法来实现这一点,第一种方法是推荐的,因为它具有灵活性,而第二种方法则不推荐,因为它完全没有灵活性。
将上传的文件存储在
更多子目录中的第一种方法是首先将
"os.path.join(BASE_DIR, 'media')"设置为
"MEDIA_ROOT",如下所示:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
另外,在 "models.ImageField()" 中添加 "upload_to='images/fruits'",如下所示:
from django.db import models
class Image(models.Model):
image = models.ImageField(upload_to='images/fruits')
def __str__(self):
return str(self.image)
然后,上传的文件按照我的情况,在Windows操作系统中存储在"C:\Users\kai\django-project\media\images\fruits"中:
![enter image description here](https://istack.dev59.com/ST3tb.webp)
将上传的文件存储在更多的子目录下的第二种方法是,首先将
'media/images/fruits'设置为
"os.path.join()"的第二个参数,如下所示:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/images/fruits')
MEDIA_URL = '/media/'
请设置“models.ImageField()”为
“无参数”,如下所示:
from django.db import models
class Image(models.Model):
image = models.ImageField()
def __str__(self):
return str(self.image)
然后,上传的文件按照我的情况在Windows中存储在"C:\Users\kai\django-project\media\images\fruits"下面,如下所示。但是正如我之前所说,第一种方法是推荐的,因为它更加灵活,而第二种方法则完全不灵活:
![enter image description here](https://istack.dev59.com/WQmFx.webp)
此外,如果我们不按照下面所示设置
“MEDIA_ROOT”:
MEDIA_URL = '/media/'
或者像下面一样将“os.path.join()”函数的第二个参数设置为空字符串:
MEDIA_ROOT = os.path.join(BASE_DIR, '')
MEDIA_URL = '/media/'
或者不要像下面这样设置"os.path.join()"的第二个参数:
MEDIA_ROOT = os.path.join(BASE_DIR)
MEDIA_URL = '/media/'
并且将"models.ImageField()"的参数设置为“无参数”,如下所示:
from django.db import models
class Image(models.Model):
image = models.ImageField()
def __str__(self):
return str(self.image)
然后,上传的文件存储在与“db.sqlite3”和“manage.py”相同级别的位置,即在django项目根目录下方,如下所示:
![enter image description here](https://istack.dev59.com/bQTfU.webp)
此外,如果我们在上传文件后更改了
"MEDIA_ROOT",则无法显示已上传的文件,而即使我们更改
"models.ImageField()",仍然可以显示已上传的文件。
例如,我们将
"os.path.join(BASE_DIR,'media')"设置为
"MEDIA_ROOT":
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
并且,将"upload_to='images/fruits'"设置为以下所示的"models.ImageField()":
from django.db import models
class Image(models.Model):
image = models.ImageField(upload_to='images/fruits')
def __str__(self):
return str(self.image)
然后,上传
文件"orange.jpg":
![enter image description here](https://istack.dev59.com/mVuI3.webp)
然后,在文件的“更改图像”页面上,如下所示,单击
“images/fruits/orange.jpg”:
![enter image description here](https://istack.dev59.com/XAlRL.webp)
然后,文件"orange.jpg"如下所示显示:
![enter image description here](https://istack.dev59.com/8Wjfa.webp)
现在,我们将
"MEDIA_ROOT"从
"os.path.join(BASE_DIR, 'media')"更改为
"os.path.join(BASE_DIR, 'hello/world')":
MEDIA_ROOT = os.path.join(BASE_DIR, 'hello/world')
MEDIA_URL = '/media/'
再次点击文件的“更改图片”页面上的“images/fruits/orange.jpg”,如下所示:
![enter image description here](https://istack.dev59.com/XEtad.webp)
然后,
"orange.jpg"文件没有显示。相反,出现了以下错误:
![enter image description here](https://istack.dev59.com/bzqDz.webp)
接着,就像我之前说的那样,即使我们在上传文件后更改了"models.ImageField()",我们仍然可以显示已上传的文件。因此,现在我们将"MEDIA_ROOT"从"os.path.join(BASE_DIR, 'hello/world')"更改回"os.path.join(BASE_DIR, 'media')":
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
将 "models.ImageField(upload_to='images/fruits')" 更改为 "models.ImageField(upload_to='hello/world')":
from django.db import models
class Image(models.Model):
image = models.ImageField(upload_to='hello/world')
def __str__(self):
return str(self.image)
再次点击文件的“更改图像”页面上的“images/fruits/orange.jpg”,如下所示:
![enter image description here](https://istack.dev59.com/wPRsa.webp)
然后,文件"orange.jpg"如下所示显示:
![enter image description here](https://istack.dev59.com/iLW9U.webp)
<MEDIA_URL>
接下来,我将解释"MEDIA_URL"。
"MEDIA_URL"设置媒体文件URL的主机部分和文件部分之间的目录(中间)部分,如下所示,并且设置"MEDIA_URL"绝对不会影响上传文件存储目录的绝对路径:
Host Directory File
| | |
<-------------> <----------> <-------->
https://www.example.com/media/images/orange.jpg
例如,我们将
'/media/'设置为
"MEDIA_URL":
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
请将“models.ImageField()”设置为“没有参数”,如下所示:
from django.db import models
class Image(models.Model):
image = models.ImageField()
def __str__(self):
return str(self.image)
然后,上传
文件"orange.jpg":
![enter image description here](https://istack.dev59.com/h7Bmu.webp)
然后,前往文件的
“更改图片”页面,然后单击
“orange.jpg”:
![enter image description here](https://istack.dev59.com/WJr5P.webp)
接下来,文件的URL将会显示如下:
![enter image description here](https://istack.dev59.com/seDCX.webp)
正如您所看到的,
目录部分“media”位于
主机部分“localhost:8000”和
文件部分“orange.jpg”之间。
Host Directly File
| | |
<------------> <---> <-------->
http://localhost:8000/media/orange.jpg
而且,这个URL是以"https"开头,"www.example.com"结尾的:
Host Directly File
| | |
<-------------> <---> <-------->
https://www.example.com/media/orange.jpg
并且,即使在上传文件后,我们也可以更改URL的目录部分。因此,只需按照以下所示更改“MEDIA_URL”从“/media/”到“/images/fruits/”:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/images/fruits/'
然后,再次点击
“orange.jpg”:
![enter image description here](https://istack.dev59.com/9ISam.webp)
然后,目录部分“media”被更改为“image/fruits”,如下所示:
![enter image description here](https://istack.dev59.com/FagEd.webp)
此外,我们可以通过将 "MEDIA_URL" 和 "models.ImageField()" 结合使用来设置 URL 的目录部分。在这种情况下,我们只能在上传文件后更改由 "MEDIA_URL" 设置的目录部分,而无法在上传文件后更改由 "models.ImageField()" 设置的目录部分。
例如,我们可以将 "/media/" 设置为 "MEDIA_URL",如下所示:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
在 "models.ImageField()" 中添加 "upload_to='images/fruits'",如下所示:
from django.db import models
class Image(models.Model):
image = models.ImageField(upload_to='images/fruits')
def __str__(self):
return str(self.image)
然后,上传
文件"orange.jpg":
![enter image description here](https://istack.dev59.com/2Fl41.webp)
然后,前往文件的“更改图像”页面,然后单击“images/fruits/orange.jpg”:
![enter image description here](https://istack.dev59.com/pmf8x.webp)
然后,文件的URL如下所示显示:
the URL of the file。
![enter image description here](https://istack.dev59.com/Lqs9t.webp)
然后,目录部分是:
media/images/fruits
现在,我们将
"MEDIA_URL"从
'/media/'更改为
'/hello/world/':
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/hello/world/'
将"models.ImageField(upload_to='images/fruits')"更改为"models.ImageField(upload_to='hey/earth')":
from django.db import models
class Image(models.Model):
image = models.ImageField(upload_to='hey/earth')
def __str__(self):
return str(self.image)
然后,再次点击
"images/fruits/orange.jpg":
![enter image description here](https://istack.dev59.com/YdDML.webp)
然后,文件的URL如下所示显示:
![enter image description here](https://istack.dev59.com/4g8C2.webp)
然后,在上传文件 "orange.jpg" 后,我们可以更改由 "MEDIA_URL" 设置的目录部分 "media" 的一部分为 "hello/world",而在上传文件 "orange.jpg" 后,我们无法更改由 "models.ImageField()" 设置的目录部分 "images/fruits" 的一部分为 "hey/earth"。
hello/world/images/fruits
此外,如果我们不按如下所示设置
"MEDIA_URL":
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
或者将
空字符串设置为下面所示的
"MEDIA_URL":
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = ''
或者像下面这样将一个或多个斜杠设置为"MEDIA_URL":
MEDIA_ROOT = os.path.join(BASE_DIR)
MEDIA_URL = '/////'
并将"models.ImageField()"的参数设置为无,如下所示:
from django.db import models
class Image(models.Model):
image = models.ImageField()
def __str__(self):
return str(self.image)
然后,在下面所示的情况下,主机部分“localhost:8000”和文件部分“orange.jpg”之间没有设置目录部分:
![enter image description here](https://istack.dev59.com/2QFup.webp)
http://localhost:8000/orange.jpg