J'essaye de créer un modèle multi-utilisateur dans django. Je suis nouveau sur django et, en tant que tel, je ne suis pas en mesure d'obtenir le résultat exact dont j'ai besoin.

J'obtiens une erreur en essayant de créer un superutilisateur.

Voici mes models.py

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

ROLES =(
        ('main', 'Main'),
        ('teacher', 'Teacher'),
        ('student', 'Student'),
        )

Voici mon registre et ma fonction

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)

Mon admin.py

from django.contrib import admin
from .models import User, School

admin.site.register(School)
admin.site.register(User)

Essayer de créer un super-utilisateur lance le suivi suivant

(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
0
Ptar 19 févr. 2021 à 23:21

1 réponse

Meilleure réponse
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)

Dans le modèle User, il existe un champ non nullable appelé user qui est une clé étrangère vers School.

Lors de la création d'un superutilisateur à l'aide de la commande de gestion django, il ne demandera que le nom d'utilisateur, l'email, le mot de passe.

Dans ce scénario, user (aka ForeignKey to School) sera vide, c'est pourquoi il échoue avec user_id est nul.

Il existe 2 façons de gérer cela.

  1. Rendre le champ user nullable. Avec cela, createsuperuser pourra créer de nouveaux utilisateurs. Plus tard, vous pouvez remplir le champ user.
  2. Écrivez votre propre commande de gestion qui prend tous les champs requis pour créer un utilisateur et créer un superutilisateur.
1
ChillarAnand 24 févr. 2021 à 02:36