Django Allauth: Дублирующееся значение ключа нарушает ограничение уникальности: Ключ (имя пользователя)=() уже существует

Я уже некоторое время пытаюсь решить проблему с моей пользовательской моделью пользователя allauth Django. Я хочу использовать только email, имя, фамилию и пароль в форме регистрации пользователя, и я могу заставить ее работать один раз, но когда регистрируется второй пользователь, он говорит, что имя пользователя уже существует. Я видел других людей с подобной проблемой, но, к сожалению, их решения не работают. Если я удалю пользовательскую форму учетной записи, то она работает, но мне нужно включить имя и фамилию в мою форму регистрации, поэтому я не уверен, как обойти это. Любая помощь будет оценена!

settings.py

AUTH_USER_MODEL = 'accounts.CustomUser'

ACCOUNT_EMAIL_REQUIRED = True

ACCOUNT_UNIQUE_EMAIL = True

ACCOUNT_AUTHENTICATION_METHOD = 'email'

ACCOUNT_USERNAME_REQUIRED = False

ACCOUNT_USER_MODEL_USERNAME_FIELD = None
# I have also tried ACCOUNT_USER_MODEL_USERNAME_FIELD = 'username' and ACCOUNT_USER_MODEL_USERNAME_FIELD = 'email' per the solution linked above, but that did not work for my use case

ACCOUNT_FORMS = {
    'signup': 'accounts.forms.CustomUserCreationForm'
}

models.py

class CustomUser(AbstractUser):

    email = models.EmailField(max_length=256)
    first_name = models.CharField(max_length=128)
    last_name = models.CharField(max_length=128)

    REQUIRED_FIELDS = ['email', 'first_name', 'last_name']

forms.py

class CustomUserCreationForm(UserCreationForm):

    class Meta:
        model = get_user_model()
        fields = ('email', 'first_name', 'last_name')

Вы можете переопределить django-allauth SignUpForm и сохранить необходимые поля в методе save().

from django import forms

from allauth.account.forms import SignupForm


class CustomUserCreationForm(SignupForm):

    email = forms.IntegerField()
    first_name = forms.CharField(max_length=20)
    last_name = forms.CharField(max_length=20)

    def save(self, request):

        user = super(CustomUserCreationForm, self).save(request)
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        # You must return the original result.
        return user

Нашел ответ, немного поиграв с ним и используя ответ Анкита в качестве шаблона.

forms.py

from django import forms
from allauth.account.forms import SignupForm


class CustomUserCreationForm(SignupForm):

    email = forms.EmailField(max_length = 256)
    first_name = forms.CharField(max_length = 128)
    last_name = forms.CharField(max_length = 128)

    def save(self, request):

        user = super(CustomUserCreationForm, self).save(request)
        user.save()

        return user

settings.py

ACCOUNT_EMAIL_REQUIRED = True

ACCOUNT_UNIQUE_EMAIL = True

ACCOUNT_AUTHENTICATION_METHOD = 'email'

ACCOUNT_USERNAME_REQUIRED = False

ACCOUNT_USER_MODEL_USERNAME_FIELD = None

ACCOUNT_FORMS = {
    'signup': 'accounts.forms.CustomUserCreationForm'
}
Вернуться на верх