Django MEDIA_ROOT,MEDIA_URL等

时间:2017-04-13 00:56:42

标签: django

这是我第一次使用MEDIA_ROOT / MEDIA_URL,我对配置感到有些困惑。我有一个图像上传表单,保存原始图像加上调整大小的副本。我想将两个图像保存到我的MEDIA文件夹,但将它们分开。目前的结构:

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 / 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 %}

2 个答案:

答案 0 :(得分:0)

首先在 settings.py MEDIA_URL 中必须是这样的:

    MEDIA_URL = "/media/"

然后删除 MEDIA 文件夹。只有媒体文件夹就足够了。 如果您需要为上传的图片添加缩略图,可以使用django easy_thumbnails

答案 1 :(得分:0)

根据文件

MEDIA_ROOT是保存用户上传文件的目录的绝对文件系统路径。

将上传的图片推送到根目录的代码应该是settings.MEDIA_ROOT/<sub-folder>而不是settings.MEDIA_URL

另一方面,

MEDIA_URLurl占位符,客户应该点击访问您的媒体。当您不想将媒体保留在本地文件系统上,而是放在像amazon s3这样的外部存储上时,这非常有用。

在模板中使用{{MEDIA_URL}}为您提供了一种不对最终媒体位置进行硬编码的好方法。