Как добавить изображение по умолчанию в django ImageField с Amazon S3 для хранения файлов?
Я создал пользовательскую модель пользователя, которая содержит поле изображения для аватара:
class User(AbstractUser):
avi_pic = models.ImageField(
upload_to='avi/', default='avi/default_avi.jpg')
username = models.CharField(max_length=30, unique=True)
bio = models.CharField(max_length=150, null=True, blank=True, default='')
def __str__(self):
return self.username
Я хочу иметь avi по умолчанию для всех новых пользователей, поэтому я добавил изображение в ведро AWS3 и добавил путь к полю модели. Путь к этому изображению в моем ведре S3 выглядит следующим образом:
mybucket/media/avi/default_avi.png
Для создания пользователя у меня есть APIView:
class CreateUser(APIView):
def post(self, request):
serializer = UserRegisterSerializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
^ при регистрации нового пользователя указывается только имя пользователя.
и сериализатор моделей:
class UserRegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username')
def validate_username(self, value):
if User.objects.filter(username=value).exists():
raise serializers.ValidationError("Username is already taken.")
allowed_characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.'
if any(char not in allowed_characters for char in value):
raise serializers.ValidationError(
"Invalid characters in username.")
return value
Моя проблема заключается в том, что когда я создаю новую учетную запись, пользователь не получает изображение по умолчанию. Я настроил свои параметры следующим образом:
AUTH_USER_MODEL = 'users.User'
STATIC_URL = 'static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = 'https://MYBUCKET.s3.amazonaws.com/media'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']
AWS_S3_REGION_NAME = os.environ['AWS_S3_REGION_NAME']
AWS_S3_SIGNATURE_NAME = os.environ['AWS_S3_SIGNATURE_NAME']
AWS_S3_FILE_OVERWRITE = os.environ['AWS_S3_FILE_OVERWRITE']
AWS_DEFAULT_ACL = os.environ['AWS_DEFAULT_ACL']
AWS_QUERYSTRING_AUTH = os.environ['AWS_QUERYSTRING_AUTH']
AWS_S3_VERIFY = os.environ['AWS_S3_VERIFY']
и я включил это в основной urls.py моего проекта:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
Может быть, я что-то упускаю или неправильно настраиваю? Также, когда я вхожу в админ-панель Django и перехожу к пользователю, рядом с полем для изображения avi появляется надпись «файл не выбран».
Вы говорите, что путь к изображению - «mybucket/media/avi/default_avi.png», но по умолчанию вставили изображение .jpg.
Исправьте модель пользователя, указав правильный путь к изображению по умолчанию:
avi_pic = models.ImageField(
upload_to='avi/', default='avi/default_avi.png')
MEDIA_URL должен указывать на ваш Bucket, а не на MEDIA_ROOT. удалите MEDIA_ROOT из настроек и установите:
MEDIA_URL = 'https://MYBUCKET.s3.amazonaws.com/media/'
Удалите статическую строку из ваших урлов.
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)