При регистрации получаю django.db.utils.IntegrityError: ОШИБКА: повторяющееся значение ключа
При регистрации запись Попадает в бд, но выкидывает
"""2022-03-12 18:17:49.464 MSK [9604] ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "cv_app_customuser_username_key"
2022-03-12 18:17:49.464 MSK [9604] ПОДРОБНОСТИ: Ключ "(username)=(qw)" уже существует."""
Как я понимаю, запрос почему-то проходит дважды.
сносил бд, сносил миграции, не могу найти где это происходит в коде, в логах Postgres повторных Инсертов не вижу(но вполне возможно, что не правильно их смотрю)
MODELS.PY
class UserManager(BaseUserManager):
def _create_user(self, username, password=None, **extra_fields):
if username is None:
raise TypeError('Users should have a username')
if password is None:
raise TypeError('Users should have password')
user = self.model(username=username, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, username=None, password=None, **extra_fields):
extra_fields.setdefault('is_superuser', False)
extra_fields.setdefault('is_active', True)
if extra_fields['is_superuser'] == True:
return self.create_superuser(username, password, **extra_fields)
return self._create_user(username, password, **extra_fields)
def create_superuser(self, username, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise TypeError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise TypeError('Superuser must have is_superuser=True.')
return self._create_user(username, password, **extra_fields)
class CustomUser(AbstractUser):
username = models.CharField(max_length=100, unique=True, db_index=True, verbose_name='Никнейм')
password = models.CharField(max_length=128, null=False, blank=False, verbose_name='Пароль')
email = models.EmailField(max_length=255, unique=True, db_index=True, help_text='Почта для связи с Вами.')
first_name = models.CharField(max_length=200, verbose_name='Ваше имя')
last_name = models.CharField(max_length=200, verbose_name='Ваша фамилия', null=True, blank=True)
phone = models.CharField(max_length=20, verbose_name='Телефонный номер', null=True, blank=True)
is_active = models.BooleanField(default=True, verbose_name='Active')
last_login = models.DateTimeField(auto_now=True, verbose_name='Last login')
is_superuser = models.BooleanField(default=False, verbose_name='Superuser status')
is_staff = models.BooleanField(default=False, verbose_name='Is Staff')
registration_date = models.DateField(auto_now=True, verbose_name='Дата регистрации')
user_experience = models.ForeignKey(WorkingExperience, verbose_name='Опыт работы', on_delete=models.PROTECT, blank=True, null=True)
user_education = models.ForeignKey(EducationExperience, verbose_name='Образование', on_delete=models.PROTECT, blank=True, null=True)
objects = UserManager()
class Meta:
verbose_name = 'Работодатель'
verbose_name_plural = 'Работодатели'
ordering = ['-registration_date']
def __str__(self):
return self.username
def __repr__(self):
return f'CustomUser obj - {self.username}'
VIEWS.Py
class RegistrationView(View):
""" Регистрация """
def get(self, request, *args, **kwargs):
form = RegistrationForm(request.POST or None)
context = {'form': form}
return render(request, 'registration.html', context)
def post(self, request, *args, **kwargs):
form = RegistrationForm(request.POST or None)
if form.is_valid():
new_user = form.save(commit=False)
new_user.username = form.cleaned_data['username']
new_user.email = form.cleaned_data['email']
new_user.first_name = form.cleaned_data['first_name']
new_user.last_name = form.cleaned_data['last_name']
new_user.save()
new_user.set_password(form.cleaned_data['password'])
new_user.save()
CustomUser.objects.create_user(
username=form.cleaned_data['username'],
password=form.cleaned_data['password'],
email=form.cleaned_data['email'],
phone=form.cleaned_data['phone'],
)
user = authenticate(
username = form.cleaned_data['username'],
password = form.cleaned_data['password'],
)
login(request, user)
return HttpResponseRedirect('/')
context = {'form': form}
return render(request, 'registration.html', context)
FORMS.py
class RegistrationForm(ModelForm):
"""Форма регистрации"""
password = forms.CharField(widget=forms.PasswordInput)
confirm_password = forms.CharField(widget=forms.PasswordInput)
phone = forms.CharField(required=False)
address = forms.CharField(required=False)
email = forms.EmailField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['username'].label = 'Логин'
self.fields['password'].label = 'Пароль'
self.fields['confirm_password'].label = 'Подтвердите Пароль'
self.fields['email'].label = 'Электронный адресс'
self.fields['phone'].label = 'Номер телефона'
self.fields['first_name'].label = 'Имя'
self.fields['last_name'].label = 'Фамилия'
def clean_username(self):
username = self.cleaned_data['username']
if CustomUser.objects.filter(username=username).exists():
msg = f'Пользователь с таким логином ({username}) существует!'
raise forms.ValidationError(msg)
return username
def clean_email(self):
email = self.cleaned_data['email']
if CustomUser.objects.filter(email=email).exists():
raise forms.ValidationError(f'Пользователь с такой почтой ({email} уже существует!)')
return email
class Meta:
model = CustomUser
fields = [
'username',
'password',
'confirm_password',
'email',
'phone',
'first_name',
'last_name',
]
registration.html
<form action="{% url 'registration' %}" method="POST">
{% csrf_token %}
{{ form|crispy }}
<input type="submit" class="btn btn-success btn-block" value="Зарегистрироваться">
</form>