'How to upload images in Django

I want to upload thumbnail into media/thumbnails folder, however

my images uploads to media/thumbnails/thumbnails folder.

How can I fix this?

All my code

models.py

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = RichTextField(null=True,blank=True)
    date_posted = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    topic = models.ForeignKey(Topic,on_delete=models.SET_NULL,null=True)
    thumbnail = models.ImageField(default='default.jpg',upload_to='thumbnails/')

    def __str__(self):
        return self.title
    
    def get_absolute_url(self):
        return reverse('post-detail',kwargs={'pk':self.pk})

    def save(self, *args, **kwargs):
        super(Post, self).save(*args, **kwargs)

        new_image = self.crop_max_square(Image.open(self.thumbnail.path)).resize((300, 300), Image.LANCZOS)

        new_image_io = BytesIO()
        new_image.save(new_image_io, format='JPEG')

        temp_name = self.thumbnail.name
        self.thumbnail.delete(save=False)  

        self.thumbnail.save(
            temp_name,
            content=ContentFile(new_image_io.getvalue()),
            save=False
        )

settings.py

MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'


Solution 1:[1]

Try replacing this:

temp_name = self.thumbnail.name

with this:

temp_name = os.path.basename(self.thumbnail.name)

You will also need import os.

The Django docs indicate that self.thumbnail.name will return "the name of the file including the relative path...". When you call self.thumbnail.save() it is probably adding 'thumbnails/' to the path as declared in your ImageField.upload_to attribute.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 MattRowbum