这是我第一次使用MEDIA_ROOT/MEDIA_URL,我对它的配置有点迷惑。我有一个图像上传表,保存原始图像加上一个调整大小的副本。我想要将这两个图像保存到我的媒体文件夹中,但要将它们分开。当前结构:
project/
----apps/
--------appOne/
------------static/
------------templates/
------------__init__.py
------------models.py
------------urls.py
------------views.py
--------__init__.py/
----MEDIA/
----project/
--------__init__.py
--------settings.py
--------urls.py
----manage.py
我希望将原始上传的图像保存到MEDIA/,并将调整大小的图像保存到媒体文件夹内的文件夹中,如MEDIA/ MEDIA /。现在,它嵌套了3次:
original image goes to ---> MEDIA/media/
resized image goes to ---> MEDIA/media/media
我几乎可以肯定我的设置是错误的,但我已经摆弄它太久了,什么都不起作用。似乎每个教程的配置都不同,我只是不确定首选的结构是什么,也不确定为什么我当前的配置不能按我期望的方式工作。
这是我的settings.py:
MEDIA_ROOT = os.path.join(BASE_DIR,'MEDIA')
MEDIA_URL = "media/"
models.py:
from django.conf import settings
from smartfields import fields
from smartfields.dependencies import FileDependency
from smartfields.processors import ImageProcessor
class Image(models.Model):
client = models.ForeignKey(Client, null=True, blank=True)
model_pic = fields.ImageField(upload_to=settings.MEDIA_URL, dependencies=[
FileDependency(processor=ImageProcessor(
format='PNG', scale={'max_width': 500, 'max_height': 500}))
])
views.py:
def upload(request):
form = ImageUploadForm(request.POST, request.FILES)
if form.is_valid():
client = Client.objects.get(id=request.session['id'])
image = Image.objects.create(client=client, model_pic=form.cleaned_data['image'])
return redirect(reverse('cphh:gallery'))
def show_images(request):
context = {
'images': Image.objects.all().order_by('-created_at'),
'media_url': settings.MEDIA_URL,
}
return render(request,'cphh/gallery.html', context)
三重嵌套的上传图像确实可以在我的模板上正确呈现:
{% for image in images %}
<img class="gallery-image" src="{{media_url}}{{ image.model_pic }}"
{% endfor %}
发布于 2017-04-13 15:03:36
根据文档
MEDIA_ROOT
是存放用户上载文件的目录的绝对文件系统路径。
将上传的图片推送到根目录的代码应该使用settings.MEDIA_ROOT/<sub-folder>
而不是settings.MEDIA_URL
另一方面,MEDIA_URL
是客户端访问您的媒体时应点击的url
的占位符。当你不想把你的媒体保存在本地文件系统上,而是保存在像亚马逊s3这样的外部存储上时,这是很有用的。
在模板中使用{{MEDIA_URL}}
为您提供了一种不对最终媒体位置进行硬编码的好方法。
发布于 2017-04-13 14:42:01
首先,在settings.py MEDIA_URL中必须是这样的:
MEDIA_URL = "/media/"
然后删除介质文件夹。仅介质文件夹就足够了。另外,如果你需要上传图片的缩略图,你可以使用Django easy_thumbnails包
https://stackoverflow.com/questions/43381889
复制相似问题