4

I am trying to use Django's user model, but when I cannot create a new user. I already ran python manage.py makemigrations and python manage.py migrate. If I try to run the commands again, I get a "No Changes Detected" message.

I was able to create a superuser for Django admin, and I can use that user to log into my web application using the views that I created, but if I try to create a user, it does not appear in Django admin.

models.py

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

# Create your models here.
class User(AbstractUser):
    pass

views.py for creating the user

from django.db import IntegrityError
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User

def register(request):
    if request.method == "POST":
        username = request.POST["username"]
        password = request.POST["password"]
        confirm = request.POST["confirm"]
        if password != confirm:
            return render(request, "capstone/register.html",{
                "error_message": "Your passwords must match."
            })

        try:
            user = User.objects.create_user(username, password)
            user.save()
        except IntegrityError:
            return render(request, "capstone/register.html",{
                "error_message": "You will need to pick another username."
            })
        login(request, user)
        return HttpResponseRedirect(reverse("index"))

    else:
        return render(request, "capstone/register.html")

I have also added AUTH_USER_MODEL = 'capstone.User' to my project's setting.py.
I have also looked at this documentation, but it did not help.

Does anyone know how to fix this problem?

settings.py

"""
Django settings for finalproject project.

Generated by 'django-admin startproject' using Django 3.2.5.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-fc=64ht^dmr#=ig25b=37o5ux#-s+%lg1+3xc4&y1byug4i6uf'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'capstone',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'finalproject.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'finalproject.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
  • I can see you want to create a customer user model but you have done nothing there, if you are not using that mode, use the default one `from django.contrib.auth.models import User` – sikaili99 Jul 26 '22 at 21:36
  • @MathewsMusukuma, I added that line like how the answer says, but nothing changed. – user19590524 Jul 26 '22 at 21:38
  • Since you are not using a custom user model, remove this `AUTH_USER_MODEL = 'capstone.User'` in setting.py – sikaili99 Jul 26 '22 at 21:56
  • @MathewsMusukuma, I got this error in the console: ```ERRORS: auth.User.groups: (fields.E304) Reverse accessor for 'auth.User.groups' clashes with reverse accessor for 'capstone.User.groups'.``` – user19590524 Jul 26 '22 at 22:02
  • It looks like you are still using your custom model, can you share the imports that are in views.py by updating your question? – sikaili99 Jul 26 '22 at 22:08
  • @MathewsMusukuma, I added the imports to my question. – user19590524 Jul 26 '22 at 22:12
  • It looks fine, make sure after removing `AUTH_USER_MODEL = 'capstone.User'` in setting.py save the file. – sikaili99 Jul 26 '22 at 22:15
  • @MathewsMusukuma, the error is still there along with this message: ```HINT: Add or change a related_name argument to the definition for 'auth.User.groups' or 'capstone.User.groups'. auth.User.user_permissions: (fields.E304) Reverse accessor for 'auth.User.user_permissions' clashes with reverse accessor for 'capstone.User.user_permissions'.```. How would I add a ```related_name``` with the pass in the User model? – user19590524 Jul 26 '22 at 22:18
  • I am not sure what customisation you want to do in that custom model, but if you are not using, then completely remove it – sikaili99 Jul 26 '22 at 22:26
  • @MathewsMusukuma, I want to use the default user model, but that hint message is coming up with the error and am wondering how to fix the clashing that its talking about. – user19590524 Jul 26 '22 at 22:32
  • @MathewsMusukuma, I added my settings.py, and I removed the User model from my question, so that my models.py is now empty. After I removed the User model and tried to register then login, I received this error while trying to login ```no such table: auth_user```. – user19590524 Jul 26 '22 at 22:57
  • @MathewsMusukuma, I did that and am receiving: ```return Database.Cursor.execute(self, query, params) django.db.utils.OperationalError: no such table: auth_user``` when I try to login or access the admin interface. – user19590524 Jul 26 '22 at 23:59
  • @MathewsMusukuma, I did that, and when I tries to makemigrations and migrate, it said, "No Changes Detected," and the same error message is about auth_user is coming up. I tried deleting the ```db.sqlite3```, but it wouldn't let me. – user19590524 Jul 27 '22 at 01:38

2 Answers2

3

When you have used the create_user function, you have to first create create_user function in models.py

models.py

from django.db import models
from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser)

class UserManager(BaseUserManager):
    def create_user(self, email, password=None):
        """
        Creates and saves a User with the given email and password.
        """
        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_staffuser(self, email, password):
        """
        Creates and saves a staff user with the given email and password.
        """
        user = self.create_user(
            email,
            password=password,
        )
        user.staff = True
        user.save(using=self._db)
        return user

def create_superuser(self, email, password):
        """
        Creates and saves a superuser with the given email and password.
        """
        user = self.create_user(
            email,
            password=password,
        )
        user.staff = True
        user.admin = True
        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    pass

    objects = UserManager()

settings.py

AUTH_USER_MODEL = 'accounts.User'

For more Information: https://www.codingforentrepreneurs.com/blog/how-to-create-a-custom-django-user-model/

0
class User(AbstractBaseUser, PermissionsMixin):
    """
    Custom User model with email as the primary identifier field.
    """
    email = models.EmailField(_('email address'),max_length=255,unique=True,)
    username = models.CharField(max_length=15,blank=True,null=True)
    is_staff = models.BooleanField(_('staff status'),default=False,help_text=_('Designates whether the user can log into this admin site.'),)
    is_active = models.BooleanField(_('active'),
    default=True,
    help_text=_(
        'Designates whether this user should be treated as active. '
        'Unselect this instead of deleting accounts.'
    ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
    uuid_txt = models.CharField(
    _('uuid text'),
    max_length=36,
    unique=True,
    help_text=_(
        'UUID representing this user. '
        'Helps identify this user without their user ID and can be shared 
    publicly.'
    ),
    error_messages={
        'unique': _('A user with that uuid_txt already exists.'),
    },
    )
    deleted = models.DateTimeField(default=None,blank=True, null=True)
    is_deleted = models.BooleanField(default=False)


    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []