Я думаю, что ваш идентификатор проблемы с instance.user.id
Я бы посоветовал вам попытаться импортировать пользователя, как показано ниже:
from django.contrib.auth.models import User
user = User.objects.get(id=user_id)
def create_user_image_path(instance, image_name):
image_name = str(user) + image_name[-4:]
return 'users/{0}/avatars/{1}'.format(user.id, image_name)
Однако django рекомендует пользователю AUTH_USER_MODEL
реализацию
from django.contrib.auth import get_user_model
User = get_user_model()
Обновление
Когда вы просматриваете хранилище переопределения, переменная name
получает имя изображения, которое вы собираетесь загрузить.Ваш file_path = os.path.dirname(name)
, вы возвращаете папку с именем изображения.Когда shutil.rmtree связывается, чтобы найти папку, он возвращает ошибку и не может найти путь.Используйте условное выражение, например if
или try except block
, как показано ниже.
from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django.core.files.storage import default_storage
import os
class OverwriteStorage(FileSystemStorage):
def get_available_name(self, name, max_length=None):
"""Returns a filename that's free on the target storage system, and
available for new content to be written to.
Found at http://djangosnippets.org/snippets/976/
This file storage solves overwrite on upload problem. Another
proposed solution was to override the save method on the model
like so (from https://code.djangoproject.com/ticket/11663):
def save(self, *args, **kwargs):
try:
this = MyModelName.objects.get(id=self.id)
if this.MyImageFieldName != self.MyImageFieldName:
this.MyImageFieldName.delete()
except: pass
super(MyModelName, self).save(*args, **kwargs)
"""
# If the filename already exists, remove it as if it was a true file system
if self.exists(name):
os.remove(os.path.join(settings.MEDIA_ROOT, name))
# default_storage.delete(os.path.join(settings.MEDIA_ROOT, name))
return name
Как и в вашем случае
class OverwriteStorage(FileSystemStorage):
def get_available_name(self, name, *args, **kwargs):
# Delete all avatars in directory before adding new avatar.
# (Sometimes we have different extension names, so we can't delete by name
if self.exists(name):
file_path = os.path.dirname(name)
shutil.rmtree(os.path.join(settings.MEDIA_ROOT, file_path))
return name