Vous obtenez l'erreur suivante lorsque j'essaie de créer un nouveau superutilisateur à l'aide du terminal.

TypeError: create_superuser() missing 3 required positional arguments: 'first_name', 'last_name', and 'location'

J'ai suivi une autre page stackoverflow, dans les commentaires ci-dessous. Dans cette page, il a insisté pour créer une fonction create_superuser avec user.save(using=self._db) Ce code a toujours des bugs,

Comment utiliser "prénom", "nom" et "emplacement" sans leur fournir de valeurs par défaut.

First_name, last_name et location sont CharField avec max_length = 30 et il peut avoir des valeurs vides.

Dans ce modèle d'utilisateur personnalisé, le nom d'utilisateur est remplacé par mobile_no en le rendant unique dans la classe User.

models.py

from django.db import models
from django.contrib.auth.models import (
        AbstractBaseUser, BaseUserManager,PermissionsMixin
    )
class UserManager(BaseUserManager):
    # All required field must be passed below as argument
    def create_user(self, mobile_no, role, email, first_name, last_name, location, password=None, is_active=True,is_staff=False, is_admin= False):
        if not mobile_no:
            raise ValueError("User must have an Mobile number as username ")
        if not password:
            raise ValueError("Users must have a password")

        user_obj= self.model(
            mobile_no= mobile_no
        )
        user_obj.email = email
        user_obj.set_password(password)
        user_obj.role = role
        user_obj.first_name = first_name
        user_obj.las_name = last_name
        user_obj.is_active = is_active
        user_obj.location = location
        user_obj.is_staff = is_staff
        user_obj.save(using=self._db)
        return user_obj

    def create_superuser(self, mobile_no, role, email, first_name, last_name, location, password=None, is_active=True,is_staff=False, is_admin= False):
        user_obj= self.model(
            mobile_no=mobile_no
        )
        user_obj.email = email
        user_obj.set_password(password)
        user_obj.role = role
        user_obj.first_name = first_name
        user_obj.las_name = last_name
        user_obj.location = location
        user_obj.is_staff = True
        user_obj.is_admin = True
        user_obj.is_active = is_active
        user_obj.save(using=self._db)
        return user_obj

    def create_staffuser(self, mobile_no, role, email, first_name, last_name, location, password=None, is_active=True,is_staff=False, is_admin= False):
        user_obj= self.model(
            mobile_no=mobile_no
        )
        user_obj.email = email
        user_obj.set_password(password)
        user_obj.role = role
        user_obj.first_name = first_name
        user_obj.las_name = last_name
        user_obj.location = location
        user_obj.is_staff = True
        user_obj.is_admin = False
        user_obj.is_active = is_active
        user_obj.save(using=self._db)
        return user_obj


    # def get_by_natural_key(self, mobile_no_):
    #     print(mobile_no_)
    #     return self.get(mobile_no=mobile_no_)

class User(AbstractBaseUser, PermissionsMixin):
    mobile_no   = models.CharField(max_length=10,unique=True)
    email       = models.EmailField(max_length=255)
    role        = models.CharField(max_length=255)
    first_name  = models.CharField(max_length=30, blank=True)
    last_name   = models.CharField(max_length=30, blank=True)
    location    = models.CharField(max_length=30, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active   = models.BooleanField(default=True)
    is_staff    = models.BooleanField(default=False)
    is_admin    = models.BooleanField(default=False)

    USERNAME_FIELD = 'mobile_no'
    REQUIRED_FIELDS = ['email', 'role']

    objects= UserManager()

    def get_full_name(self):
        return self.first_name + self.last_name

    def get_short_name(self):
        return self.mobile_no

    def __str__(self):
        return self.mobile_no

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active
1
VA splash 19 mars 2019 à 14:00

2 réponses

Meilleure réponse

Ce code fonctionne pour le cas ci-dessus

class UserManager(BaseUserManager):
    def create_user(self, mobile_no, role, password=None):
        """
        Creates and saves a User with the given email and password.
        """
        if not mobile_no:
            raise ValueError('Users must have an Mobile No')

        user = self.model(
            mobile_no=mobile_no,
        )

        user.set_password(password)
        user.activated=True
        user.save(using=self._db)
        return user

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

    def create_staffuser(self, mobile_no, role, password):
        """
         Creates and saves a staffuser with the given email and password.
        """
        user = self.create_user(mobile_no, role=role,
                                password=password
                                )
        user.is_staff = True
        user.activated=True
        user.save(using=self._db)
        return user
class Users(AbstractBaseUser, PermissionsMixin):
    object = UserManager()
    mobile_no = models.IntegerField(_('MobNumber'), null=True, blank=True,unique=True)
    email = models.EmailField(_('Email'), max_length=75, null=False, blank=False)
    first_name = models.CharField(_('FirstName'), max_length=50, null=True, blank=True)
    last_name = models.CharField(_('LastName'), max_length=70, null=True, blank=True)
    role = models.CharField(_('Role'), max_length=70, null=True, blank=True)
    location = models.CharField(_('Location'), max_length=70, null=True, blank=True)
    date_time = models.DateTimeField(_('DateTime'), auto_now=True, null=True, blank=True)
    activated = models.BooleanField(_('Activated'), default=False)
    is_admin = models.BooleanField(_('is_admin'), default=False)
    is_staff = models.BooleanField(_('is_staff'), default=False)

    def __unicode__(self):
        return str(self.mobile_no)

    def __str__(self):
        return str(self.mobile_no)

    def get_full_name(self):
        return self.first_name + " " + self.last_name

    class Meta:
        ordering = ['-id']

    @property
    def is_staff(self):
        return self.is_admin


    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return self.is_admin

    USERNAME_FIELD = 'mobile_no'
    REQUIRED_FIELDS = ['role']
4
VA splash 21 mars 2019 à 15:07

Vous rencontrez probablement ce problème, car dans vos champs obligatoires, vous avez uniquement spécifié l'adresse e-mail et le rôle sans le prénom, le nom et l'emplacement. Lors de la déclaration du gestionnaire d'utilisateurs, vous n'avez pas fourni de valeurs par défaut pour ces champs, vous devez donc les spécifier dans le champ requis. Ceci devrait régler votre problème.

Le mérite de cette réponse revient à @Daniel Roseman : Problème avec createsuperuser lors de la mise en œuvre modèle d'utilisateur personnalisé

0
David Essien 6 août 2019 à 14:51