IntegrityError when I go to create superuser in Django

33 Views Asked by At

I am doing a blog project, I have made the user registration and login to be done through email, instead of using username. When I went to create the superuser to access admin, I get the following error in terminal. For the database I have connected it with PostgreSQL.

Error:

(venv) PS C:\Users\RCA\Documents\Programar\Proyectos\blog_project> py manage.py createsuperuser Email: [email protected] Password: Password (again): This password is entirely numeric. Bypass password validation and create user anyway? [y/N]: y Traceback (most recent call last): File "C:Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute return self.cursor.execute(sql, params) psycopg2.errors.UniqueViolation: llave duplicada viola restricción de unicidad «accounts_customuser_username_key» DETAIL: Ya existe la llave (username)=().

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\manage.py", line 22, in <module>
main()
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line
utility.execute()
 File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\core\management\__init__.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
 File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\core\management\base.py", line 413, in run_from_argv
self.execute(*args, **cmd_options)
 File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 89, in execute
return super().execute(*args, **options)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\core\management\base.py", line 459, in execute
output = self.handle(*args, **options)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 238, in handle
self.UserModel._default_manager.db_manager(database).create_superuser(
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\accounts\models.py", line 22, in create_superuser
user = self.create_user(
       ^^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\accounts\models.py", line 18, in create_user
user.save(using=self._db)
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\contrib\auth\base_user.py", line 78, in save
super().save(*args, **kwargs)
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\models\base.py", line 822, in save
self.save_base(
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\models\base.py", line 909, in save_base
updated = self._save_table(
          ^^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\models\base.py", line 1067, in _save_table
results = self._do_insert(
          ^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\models\base.py", line 1108, in _do_insert
return manager._insert(
       ^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\models\query.py", line 1847, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\models\sql\compiler.py", line 1823, in execute_sql
cursor.execute(sql, params)
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\backends\utils.py", line 122, in execute
return super().execute(sql, params)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\backends\utils.py", line 79, in execute
return self._execute_with_wrappers(
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\backends\utils.py", line 92, in _execute_with_wrappers
return executor(sql, params, many, context)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\backends\utils.py", line 100, in _execute
with self.db.wrap_database_errors:
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\utils.py", line 91, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\Users\RCA\Documents\Programar\Proyectos\blog_project\venv\Lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
django.db.utils.IntegrityError: llave duplicada viola restricción de unicidad «accounts_customuser_username_key»
DETAIL:  Ya existe la llave (username)=().

My models.py:

class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None):
    if not email:
        raise ValueError('Users must have an email address')
    user = self.model(
        email=self.normalize_email(email),
    )
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_superuser(self, email, password):
    user = self.create_user(
        email=self.normalize_email(email),
        password=password,
    )
    user.is_admin = True
    user.is_staff = True
    user.is_superuser = True
    user.save(using=self._db)
    return user

class CustomUser(AbstractUser):
email = models.EmailField(unique=True)
is_staff = models.BooleanField(default=False)

objects = CustomUserManager()

USERNAME_FIELD = 'email'

REQUIRED_FIELDS = []

def __str__(self):
    return self.email

My forms.py

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

class RegisterForm(UserCreationForm):
   """
   Form for registering a new user.
   """
  email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
first_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
last_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
country = forms.CharField(max_length=30, required=False, help_text='Optional.')
username = forms.CharField(max_length=30, required=True)

class Meta:
    model = CustomUser
    fields = ['email', 'password1', 'password2', 'first_name', 'last_name', 'username',  'country']

My views.py

from django.contrib.auth import login
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic import CreateView
from django.contrib.auth.views import LoginView
from django.urls import reverse_lazy
from .forms import RegisterForm
from .models import CustomUser

class RegisterView(SuccessMessageMixin, CreateView):
"""
View for the registration of a new user.
"""
form_class = RegisterForm
template_name = 'accounts/register.html'
success_url = reverse_lazy('login')
success_message = 'Account created successfully.'
redirect_authenticated_user = True

def form_valid(self, form):
    user = form.save()
    if user is not None:
        login(self.request, user)
    return super(RegisterView, self).form_valid(form)

class LoginView(SuccessMessageMixin, LoginView):
"""
View for the login of an existing user.
"""
model = CustomUser
template_name = 'accounts/login.html'
success_message = 'Login successful.'
redirect_authenticated_user = True

def get_success_url(self):
    return reverse_lazy('blog_app:home')

def form_valid(self, form):
    login(self.request, form.get_user())
    return super(LoginView, self).form_valid(form)

Can someone help me with this problem? Sorry if I am not able to express better my mistake, I am new to Django and I don't understand very well how it works.

I hope you can guide me to solve this problem and to understand it so that I can solve it. Also to know if it is a problem with Django and the database configuration or if it has to do with PostgreSQL.

0

There are 0 best solutions below