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'
}