I'm trying to create a multiple user model in django. I am new to django and as such not in a position to get the exact result I need.
I get an error when trying to createsuperuser.
Here is my models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
ROLES =(
('main', 'Main'),
('teacher', 'Teacher'),
('student', 'Student'),
)
Here's my register and function
def Register(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
first_name = form.cleaned_data.get('first_name')
last_name = form.cleaned_data.get('last_name')
password1 = form.cleaned_data.get('password1')
messages.success(request, f'An account has successfully been created for {first_name} {last_name}. Username is {username} and password is {password1}')
return redirect('login')
else:
form = RegistrationForm()
return render(request, 'register.html', {'form': form})
class School(models.Model):
name = models.CharField(max_length=100, null=False, blank=False)
class User(AbstractUser):
user = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
role = models.CharField(max_length=10, choices=ROLES, blank=False, null=False)
class Teacher(models.Model):
school = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
name = models.CharField(max_length=30, blank=False, null=False)
code = models.CharField(max_length=30, blank=False, null=False)
class Student(models.Model):
school = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
first_name = models.CharField(max_length=30, blank=False, null=False)
last_name = models.CharField(max_length=30, blank=False, null=False)
adm = models.CharField(max_length=30, blank=False, null=False)
class Main(models.Model):
school = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
name = models.CharField(max_length=30, blank=False, null=False)
My admin.py
from django.contrib import admin
from .models import User, School
admin.site.register(School)
admin.site.register(User)
Trying to create a superuser throws the following traceback
(env) D:\Python\Django\Links Online Exams\Links_Online_Results>python manage.py createsuperuser
Username: ptar
Email address: peterolwande@gmail.com
Password:
Password (again):
Traceback (most recent call last):
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\sqlite3\base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: accounts_user.user_id
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
utility.execute()
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\management\__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\management\base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 79, in execute
return super().execute(*args, **options)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\management\base.py", line 371, in execute
output = self.handle(*args, **options)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 189, in handle
self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\models.py", line 157, in create_superuser
return self._create_user(username, email, password, **extra_fields)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\models.py", line 140, in _create_user
user.save(using=self._db)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\base_user.py", line 67, in save
super().save(*args, **kwargs)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\base.py", line 753, in save
self.save_base(using=using, force_insert=force_insert,
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\base.py", line 790, in save_base
updated = self._save_table(
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\base.py", line 895, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\base.py", line 933, in _do_insert
return manager._insert(
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\query.py", line 1254, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\sql\compiler.py", line 1397, in execute_sql
cursor.execute(sql, params)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 98, in execute
return super().execute(sql, params)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\sqlite3\base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: accounts_user.user_id
class User(AbstractUser):
user = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
role = models.CharField(max_length=10, choices=ROLES, blank=False, null=False)
In User
model, there is a non-nullable field called user
which is a ForeignKey to School
.
When creating superuser using django management command, it will ask only for username, email, password.
In this scenario, user
(aka ForeignKey to School) will be empty which is why it is failing with user_id
is null.
There are 2 ways to handle this.
user
field nullable. With this createsuperuser
will be able to create new users. Later you can populate user
field.