Как избежать ошибки дублирования ключей с помощью django allauth?
Я внес некоторые изменения в свою модель пользователя, и в результате кажется, что когда новый пользователь пытается зарегистрироваться, он получает ошибку:
IntegrityError at /accounts/signup/
duplicate key value violates unique constraint "users_user_username_key"
Я не уверен, что вызывает ошибку
Это forms.py:
from django.contrib.auth import get_user_model, forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
User = get_user_model()
class UserChangeForm(forms.UserChangeForm):
class Meta(forms.UserChangeForm.Meta):
model = User
class UserCreationForm(forms.UserCreationForm):
error_message = forms.UserCreationForm.error_messages.update(
{
"duplicate_username": _(
"This username has already been taken."
)
}
)
class Meta(forms.UserCreationForm.Meta):
model = User
def clean_username(self):
username = self.cleaned_data["username"]
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise ValidationError(
self.error_messages["duplicate_username"]
)
settings.py
# django-allauth
# ------------------------------------------------------------------------------
ACCOUNT_ALLOW_REGISTRATION = env.bool(
"DJANGO_ACCOUNT_ALLOW_REGISTRATION", True
)
# https://django-allauth.readthedocs.io/en/latest/configuration.html
ACCOUNT_AUTHENTICATION_METHOD = "username"
# https://django-allauth.readthedocs.io/en/latest/configuration.html
ACCOUNT_EMAIL_REQUIRED = True
# https://django-allauth.readthedocs.io/en/latest/configuration.html
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
# https://django-allauth.readthedocs.io/en/latest/configuration.html
ACCOUNT_ADAPTER = "pharmhand.users.adapters.AccountAdapter"
# https://django-allauth.readthedocs.io/en/latest/configuration.html
SOCIALACCOUNT_ADAPTER = (
"pharmhand.users.adapters.SocialAccountAdapter"
)
# Your stuff...
# ------------------------------------------------------------------------------
ACCOUNT_SIGNUP_FORM_CLASS = 'users.forms.UserCreationForm'
И models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
class User(AbstractUser):
# First Name and Last Name Do Not Cover Name Patterns
# Around the Globe.
name = models.CharField(
_("Name of User"), blank=True, max_length=255
)
title = models.CharField(
_("Title"), null=True, max_length=10, default='Dr'
)
first_name = models.CharField(
_("First Name"), null=True, max_length=255, default='test'
)
last_name = models.CharField(
_("Last Name"), null=True, max_length=255, default='Test'
)
job_title = models.CharField(
_("Job Title"), null=True, max_length=255, default='Test'
)
address1 = models.CharField(
_("Address 1"), null=True, max_length=255, default='Test'
)
address2 = models.CharField(
_("Address 2"), null=True, max_length=255, default='Test'
)
address3 = models.CharField(
_("Address 3"), null=True, max_length=255, default='Test'
)
city = models.CharField(
_("City"), null=True, max_length=255, default='Test'
)
post_code = models.CharField(
_("Post Code"), null=True, max_length=255, default='Test'
)
def get_absolute_url(self):
return reverse(
"users:detail", kwargs={"username": self.username}
)
Любой совет о том, как избежать ошибки, будет очень признателен, я не знаю, возможно, все осложняется гибридным подходом contrib.auth allauth
Проблемы были
ACCOUNT_SIGNUP_FORM_CLASS = 'users.forms.UserCreationForm'
Я добавил это, чтобы иметь возможность редактировать форму регистрации (что стало возможным), но это привело к побочному эффекту, я думаю, что и allauth, и contrib.auth пытались создать пользователя, что привело к ошибке. Удаление строки устранило ошибку (хотя я все еще пытаюсь понять, как редактировать поля формы регистрации)