Создайте суперпользователя, используя python manage.py, настройте сообщение в Django - PullRequest
2 голосов
/ 11 февраля 2020

В проекте требуется имя пользователя, это автоматически сгенерированный код. Для этого я сделал пользовательскую модель в соответствии с требованиями. Все работает нормально, но проблема в том, когда я пытаюсь создать суперпользователя, используя

python manage.py createsuperuser

Как я уже описал, имя пользователя является автоматически сгенерированным полем. Но консоль спрашивает у меня имя пользователя. После создания учетной записи суперпользователя необходимо распечатать код пользователя, так как мне нужен код для входа в систему, и суперпользователь успешно создан.

Как я могу получить эту функциональность? Я ищу в Google, но не могу найти подходящего решения.

Вот моя модель:

class User(AbstractBaseUser, PermissionsMixin):
"""Custom user model"""
code = models.CharField(max_length=20, unique=True, blank=False)
email = models.EmailField(max_length=255, unique=True, null=True)
name = models.CharField(max_length=255)
address = models.CharField(max_length=255, blank=True)
nid = models.CharField(max_length=30, blank=True)
profile_pic = models.CharField(max_length=255, blank=True)
gender = models.CharField(max_length=10, choices=[('Male', 'Male'), ('Female', 'Female'), ('Other', 'Other')])

is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)

objects = UserManager()
USERNAME_FIELD = 'code'
REQUIRED_FIELDS = ['name']

Вот мой менеджер пользовательских настроек:

class UserManager(BaseUserManager):
use_in_migrations = True

def create_user(self, password, **extra_fields):
    """Create new user with auto-generated code and password"""
    if 'name' not in extra_fields.keys():
        raise ValueError('Name must be needed')
    code = code_generator.generate_employee_code(extra_fields['name'][:2])
    user = self.model(code=code, **extra_fields)
    user.set_password(password)
    if 'email' in extra_fields.keys():
        email = self.normalize_email(extra_fields['email'])
        user.email = email
    try:
        user.save(using=self._db)
    except IntegrityError as e:
        raise ValueError("Email has already been used")
    return user

def create_superuser(self, name, password):
    """Create and save super user"""
    user = self.create_user(password=password, name=name)
    user.is_staff = True
    user.is_superuser = True
    user.is_admin = True
    user.save(using=self._db)
    return user

1 Ответ

1 голос
/ 11 февраля 2020

Этого можно достичь, изменив исходный код, но, как правило, это не очень хорошая идея.

Если вы все еще хотите попробовать его, вот вам go.

Найти этот файл createuperuser.py (site-packages -> django -> contrib-> auth-> management> команды) и добавьте код в нужное место.

class Command(BaseCommand):
    ...
    ...
    def handle(self, *args, **options):
    ...
    ...
        if username:
            ...
            if options['verbosity'] >= 1:
                ...
                self.stdout.write("User name:" + username) # add this code

Опять же, я не говорю, что это хорошая идея, но если я в отчаянии, я бы go за это. Кроме того, так как site-packages не является частью репозитория, вам придется делать это на каждой машине, на которой вы развертываете приложение.

...