Django在媒体文件夹内创建另一个媒体文件夹

时间:2020-09-05 21:02:01

标签: python django python-imaging-library

我是Django的初学者,这正是它的作用。我按照文档中的说明进行操作,但是无论如何还是出问题了?

在管理页面上,我添加\设置产品并选择“图片”,然后在保存时创建缩略图并尝试保存在“ / media / uploads /”中,而是创建了另一个“媒体”文件夹,并且网站上的路径为“ /media/uploads/img.png”时,图像存储在“ /media/media/uploads/img.png”中。这是代码:

/shop/settings.py:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # or even 'media/'

/shop/urls.py:
urlpatterns = [
    ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

添加完之后,然后在我的产品模型中:

/apps/store/models.py:
class Product(models.Model):
    ...
    image = models.ImageField(upload_to='media/uploads/', blank=True, null=True)
    thumbnail = models.ImageField(upload_to='media/uploads/', blank=True, null=True)
    ...

    def save(self, *args, **kwargs):
        self.thumbnail = self.make_thumbnail(self.image)
        super().save(*args, **kwargs)

    @staticmethod
    def make_thumbnail(image, size=(512, 512)):
        if not image:
            return

        img = Image.open(image)
        if img.mode in ('RGBA',):  # converting image to RGB if it's RGBA
            img.load()
            rgb_convert = Image.new('RGB', img.size, 0)
            rgb_convert.paste(img, mask=img.split()[3])
            img = rgb_convert

        img.thumbnail(size)

        thumb_io = BytesIO()
        img.save(thumb_io, 'PNG', quality=80)
        thumb = File(thumb_io, name=image.name)
        return thumb

我试图将'upload_to'更改为'uploads /',然后它以正确的方向存储文件,但是当它的路径必须为'/ media /时,它在现场的路径也更改为'/uploads/img.png' uploads / img.png'

有什么问题吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

upload_to=… parameter [Django-doc]相对于MEDIA_ROOT。因此,如果要将其存储在uploads目录中的目录media中,请使用以下命令上传该文件:

class Product(models.Model):
    # …
    thumbnail = models.ImageField(upload_to='uploads/', blank=True, null=True)

但是,为了呈现 URL,请使用.url attribute [Django-doc],因此:

{% if p.thumbnail %}
    <img src="{{ p.thumbnail.url }}">
{% endif %}

这里需要{% if p.thumbnail %}来检查NULL / None的值。

答案 1 :(得分:2)

这是因为您写了“ upload_to ='media / uploads'”。 从您的设置django将创建媒体文件夹,并且由于您编写了“ media / uploads”,因此uploads位于media文件夹内,该文件夹位于在设置中声明的主要媒体内。所以只要写

class Product(models.Model):
…
thumbnail = models.ImageField(upload_to='uploads/', blank=True, null=True)