我制作了一个自定义用户模型,其中包含头像的图像字段:
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 应指向您的存储桶而不是 MEDIA_ROOT。从您的设置中删除 MEDIA_ROOT 并设置:
MEDIA_URL = 'https://MYBUCKET.s3.amazonaws.com/media/'
从您的网址中删除静态行。
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)