ValueError: Не удается присвоить "<django.contrib.auth.models.AnonymousUser object at 0x..40>": "Members.user" должен быть экземпляром "User". [2..7] "POST /api/
Я пытаюсь зарегистрировать пользователя и сделать так, чтобы часть email входила в имя пользователя из модели Members, но получаю вышеуказанную ошибку. прошу помочь. В auth_user имя пользователя равно [blablabla]@gmail... в скобках Я пытаюсь добавить то же самое к пользователю Members, для отношения ForeignKey. Чтобы сделать пользователя равным blablabla
Сериализаторы
class RegisterSerializer(serializers.ModelSerializer):
password1 = serializers.CharField(required=True)
password2 = serializers.CharField(required=True)
user = serializers.HiddenField(default=serializers.CurrentUserDefault())
class Meta:
model = Members
fields = ('first_name', 'last_name', 'user', 'email', 'photo', 'gender', 'password1', 'password2')
def validate_email(self, email):
email = get_adapter().clean_email(email)
if allauth_settings.UNIQUE_EMAIL:
if email and email_address_exists(email):
raise serializers.ValidationError("A user is already registered with this email address.")
return email
def validate_password1(self, password):
return get_adapter().clean_password(password)
def validate(self, data):
if data['password1'] != data['password2']:
raise serializers.ValidationError("The two password fields didn't match.")
return data
def get_cleaned_data(self):
return {
'password1': self.validated_data.get('password1', ''),
'email': self.validated_data.get('email', ''),
}, {
'first_name': self.validated_data.get('first_name', ''),
'last_name': self.validated_data.get('last_name', ''),
'photo': self.validated_data.get('photo', ''),
'gender': self.validated_data.get('gender', ''),
'email': self.validated_data.get('email', ''),
'user': self.validated_data.get('user', ''),
}
def save(self, request):
adapter = get_adapter()
user = adapter.new_user(request)
self.cleaned_data, data_for_members = self.get_cleaned_data()
Members.objects.create(**data_for_members)
adapter.save_user(request, user, self)
setup_user_email(request, user, [])
user.save()
return user
class LoginSerializer(RestAuthLoginSerializer): имя пользователя = None
Модели
class Members(models.Model):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
photo = models.ImageField(upload_to='photos/%Y/%m/%d/')
gender_choices = (('F', 'Female'), ('M', 'Man'), ('U', 'Undefined'))
gender = models.CharField(max_length=1, choices=gender_choices, default='U')
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
email = models.EmailField()
def save(self, *args, **kwargs):
super(Members, self).save(*args, **kwargs)
img = self.photo
print(img, 321)
watermark(img)
Я пошел другим путем и немного изменил свои цели. Спасибо https://stackoverflow.com/a/38553202/18521916. Проблема была в том, что адаптер allauth не сохранял дополнительные поля, и я явно сохранил их в этих двух строках:
user.gender = self.cleaned_data.get('gender')
user.photo = self.cleaned_data.get('photo')
Другим решением является переопределение адаптера
Сериализаторы
from rest_framework import serializers
from api_dating.models import Members
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email
class CustomRegisterSerializer(serializers.ModelSerializer):
password1 = serializers.CharField(write_only=True)
password2 = serializers.CharField(write_only=True)
class Meta:
model = Members
fields = ['username', 'email', 'first_name', 'last_name', 'password1', 'password2', 'photo', 'gender']
def get_cleaned_data(self):
return {
'password1': self.validated_data.get('password1', ''),
'email': self.validated_data.get('email', ''),
'first_name': self.validated_data.get('first_name', ''),
'last_name': self.validated_data.get('last_name', ''),
'username': self.validated_data.get('username', ''),
'photo': self.validated_data.get('photo', ''),
'gender': self.validated_data.get('gender', ''),
}
def save(self, request):
adapter = get_adapter()
user = adapter.new_user(request)
self.cleaned_data = self.get_cleaned_data()
adapter.save_user(request, user, self)
setup_user_email(request, user, [])
user.gender = self.cleaned_data.get('gender')
user.photo = self.cleaned_data.get('photo')
user.save()
return user
Модели
from django.contrib.auth.models import AbstractUser
from django.db import models
class Members(AbstractUser):
photo = models.ImageField(upload_to='photos/%Y/%m/%d/')
gender_choices = (('F', 'Female'), ('M', 'Male'), ('U', 'Undefined'))
gender = models.CharField(max_length=1, choices=gender_choices, default='U')
Настройки
Apps
...
'rest_framework',
'rest_framework.authtoken',
'dj_rest_auth',
'dj_rest_auth.registration',
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
AUTH_USER_MODEL = 'api_dating.Members'
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'api_dating.serializers.CustomRegisterSerializer',
}
SITE_ID = 1