Issue
I'd just like to check if my Django model works or not(By trying create a new model instance on admin page). However I get FileNotFoundError at /admin/appname/modelname/add/
[Errno 2] No such file or directory: '/home/user/PycharmProjects/myproject/media/file_I_wanna_upload.file
' (It's an absolute path where the uploaded file should be situated after saving my new model instance).
In my settings.py
:
MEDIA_ROOT = 'media'
MEDIA_URL = '/media/'
In my project's urls.py
:
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
...
] + static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT
)
And finally my models.py
from PIL import Image as I
class Image(models.Model):
galery = models.ForeignKey(Galery, on_delete=models.CASCADE)
image = models.ImageField(upload_to='photos')
def save(self, *args, **kwargs):
img = I.open(self.image.path)
img.resize(size=(300, 300))
img.save(self.image.path)
return super(Image, self).save(*args, **kwargs)
Everything seems be working good. However it doesn't.
Here is another model
that I have no problems with:
class UserProfile(models.Model):
user = models.OneToOneField(CustomUser, related_name='userprofile', on_delete=models.CASCADE)
username = models.CharField(max_length=30, unique=True)
slug = models.SlugField(unique=True)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
avatar = models.ImageField(default="default.png", upload_to='avatars', blank=True)
description = models.TextField(max_length=10 ** 4, blank=True)
def __str__(self):
return self.username
def save(self, *args, **kwargs):
self.slug = slugify(self.username)
return super().save(*args, **kwargs)
What am I doing wrong? Help me please.
Solution
The issue is that the image.path won't exist until you've saved the instance. You could re-write your model as follows:
class Image(models.Model):
galery = models.ForeignKey(Galery, on_delete=models.CASCADE)
image = models.ImageField(upload_to='photos')
def save(self, *args, **kwargs):
super(Image, self).save(*args, **kwargs)
img = I.open(self.image.path)
img.resize(size=(300, 300))
img.save(self.image.path)
This is very similar to the next question: How to get content of Django ImageField before it is saved?
Answered By - 42WaysToAnswerThat
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.