Нет такого файла или каталога: 'profile_pics/img.jpg'
Когда пользователь пытается загрузить фотографию профиля, отображается эта ошибка. Однако изображение успешно загружается в базу данных и отображается в приложении. Я полагаю, что ошибка связана с перенаправлением после отправки формы, но я не могу понять, в чем дело. Я недавно настроил свое приложение с aws s3 buckets, так что это также может быть как-то связано с этим, но изображения успешно загружаются и извлекаются из ведра, так что, скорее всего, это не связано.
view:
def profile(request):
if request.method == 'POST':
p_form = ProfileUpdateForm(request.POST,
request.FILES,
instance=request.user.profile)
if p_form.is_valid():
p_form.save()
messages.success(request, f'Your account has been updated!')
return redirect('profile')
else:
p_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'p_form': p_form
}
return render(request, 'users/profile.html', context)
модель:
class Profile(models.Model):
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
....
def __str__(self):
return f'{self.user.username} Profile'
def save(self, *args, **kwargs):
super(Profile,self).save(*args, **kwargs)
img = Image.open(self.image.name)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
html
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Update Profile</legend>
{{ p_form|crispy }}
</fieldset>
<div class="form-group">
<button class="action-btn" type="submit">Update</button>
</div>
</form>
Вы можете использовать его для изменения размера или сжатия изображения.
def compress(image):
im = Image.open(image)
out_put_size = (300,300)
im.thumbnail(out_put_size)
# create a BytesIO object
im_io = BytesIO()
# save image to BytesIO object
im = im.resize([500,500])
#resize image
im = im.convert("RGB")
im = im.save(im_io,'JPEG', quality=50)
# create a django-friendly Files object
new_image = File(im_io, name=image.name)
return new_image
class Profile(models.Model):
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
def save(self, *args, **kwargs):
#image compression start
if self.image:
# call the compress function
new_image = compress(self.image)
# set self.image to new_image
self.image = new_image
#image compression end
super(Profile,self).save(*args, **kwargs)

