Как обеспечить загрузку изображения профиля при регистрации?
Я пытаюсь реализовать простую Custom-User-Registration, используя django-rest-framework
, django-allauth и dj-rest-auth.
Когда я обновляю данные пользователя и добавляю изображение, изображение загружается в нужную папку, но когда я выбираю изображение при регистрации, изображение не загружается. Что я делаю неправильно?
Это моя models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
GENDER_SELECTION = [
('M', 'Male'),
('F', 'Female'),
]
class CustomUser(AbstractUser):
# email attribute is inherited from AbstractUser
gender = models.CharField(max_length=20, choices=GENDER_SELECTION)
phone_number = models.CharField(max_length=30)
image = models.ImageField(upload_to='profile/', blank=True)
Это моя forms.py
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = get_user_model()
fields = ('email', 'username', 'phone_number', 'gender', 'image',)
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
fields = ('email', 'username', 'phone_number', 'gender', 'image',)
Это моя serializers.py
from django.db import transaction
from rest_framework import serializers
from dj_rest_auth.registration.serializers import RegisterSerializer
from dj_rest_auth.serializers import LoginSerializer as RestAuthLoginSerializer
from users.models import GENDER_SELECTION
from users.models import CustomUser
class CustomRegisterSerializer(RegisterSerializer):
gender = serializers.ChoiceField(choices=GENDER_SELECTION)
phone_number = serializers.CharField(max_length=30)
image = serializers.ImageField(max_length=None, use_url=True, allow_null=True, required=False)
# Define transaction.atomic to rollback the save operation in case of error
@transaction.atomic
def save(self, request):
user = super().save(request)
user.gender = self.data.get('gender')
user.phone_number = self.data.get('phone_number')
user.image = self.data.get('image')
user.save()
return user
class CustomUserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = ('id', 'email', 'phone_number', 'gender', 'image',)
read_only_fields = ('id', 'email',)
Мой settings.py
файл для справки
...
# Custom Settings
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
AUTH_USER_MODEL = 'users.CustomUser'
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
'dj_rest_auth.jwt_auth.JWTCookieAuthentication',
],
}
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
)
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
SITE_ID = 1
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_USERNAME_REQUIRED = True
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = False
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_CONFIRM_EMAIL_ON_GET = True
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'users.serializers.CustomRegisterSerializer',
}
REST_AUTH_SERIALIZERS = {
'LOGIN_SERIALIZER': 'users.serializers.LoginSerializer',
'USER_DETAILS_SERIALIZER': 'users.serializers.CustomUserDetailsSerializer',
}
REST_USE_JWT = True
JWT_AUTH_COOKIE = 'my-app-auth'
LOGIN_URL = 'http://127.0.0.1:8000/api/auth/login'
CORS_ORIGIN_ALLOW_ALL = True
Мое изображение загружается, когда я обновляю пользователя, но оно не загружается, когда я выбираю файл в процессе регистрации.