Сбой ограничения UNIQUE: имя пользователя account_customuser.username

У меня проблема с регистрацией пользователя. Я использую Django.

Когда я регистрирую первого пользователя, все в порядке, и пользователь появляется в панели администратора. Проблема возникает, когда я хочу зарегистрировать второго пользователя. После отправки формы регистрации появляется следующая ошибка:

File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 423, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: UNIQUE constraint failed: account_customuser.username

Похоже, что пользователь не будет сохранен, потому что имя пользователя (email) не уникально, но email второго пользователя отличается от первого. Только суперпользователь и первый зарегистрированный пользователь появляются в панели администратора.

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
from orders.models import Order


class CustomUser(AbstractUser):
    email = models.EmailField(unique=True, max_length=255, default='')
    zip_code = models.CharField(max_length=6)
    address = models.CharField(max_length=255)
    street = models.CharField(max_length=255)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now=True)
    email_confirmed = models.BooleanField(default=False)
    orders = models.ForeignKey(
        Order, related_name='orders', on_delete=models.CASCADE, null=True, blank=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __str__(self):
        return self.email

views.py

from django.shortcuts import render, redirect
from .forms import CreateUserForm


def signup(request):
    form = CreateUserForm()
    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')

    return render(request, 'views/signup.html', {'form': form})

forms.py

from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser


class CreateUserForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ['zip_code', 'address', 'street', 'first_name',
                  'last_name', 'email', 'password1', 'password2']

Похоже, что у вас все еще есть столбец username в базе данных, но вы не создаете пользователей с именами. Поэтому ограничение, вероятно, не работает, потому что у вас будет два пользователя с username в None.

Если вам не нужна колонка username, вам нужно добавить username = None в ваш класс CustomUser и сгенерировать миграции для удаления колонки.

Вернуться на верх