Как добавить изображение по умолчанию в 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)
Вернуться на верх