Как добавить собственное сообщение об ошибке при использовании команды createuperuser в Django? - PullRequest
0 голосов
/ 08 июля 2019

Я создал пользовательскую модель пользователя и хочу, чтобы адрес электронной почты и имя пользователя были уникальным полем. И я использую электронную почту в качестве основного поля имени пользователя. Оба уникальны. Проблема в том, что когда я создаю «createuperuser», я получаю мгновенную ошибку, если электронное письмо уже кем-то занято, но в случае поля имени пользователя оно проверяет уникальное условие в конце, которое выдает уродливую ошибку несоответствия уникального ограничения Postgres. Я хочу, чтобы поле имени пользователя было мгновенно проверено, как поле электронной почты.

Проверьте изображения ниже.

models.py

from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _


class UserManager(BaseUserManager):
    """Define a model manager for User model with no username field."""

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError('The given email must be set')

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        """Create and save a regular User with the given email and password."""
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)


class User(AbstractUser):
    """User model."""

    username = models.CharField(max_length=255, unique=True, null=False)
    full_name = models.CharField(max_length=255, null=True)
    email = models.EmailField(_('email address'), unique=True)
    confirm = models.BooleanField(default=False)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'full_name']

    objects = UserManager()

    def __str__(self):
        return self.email

Это то, что я хочу image

Это то, что я получаю изображение

1 Ответ

0 голосов
/ 08 июля 2019

Вы можете создать свою собственную команду django для создания суперпользователя.Пример команды создания суперпользователя может быть:

# your_app/management/commands/create_custom_superuser.py
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand


class Command(BaseCommand):
    def handle(self, *args, **options):
        if not get_user_model().objects.filter(username="admin").exists():
            # you can add some logs here
            get_user_model().objects.create_superuser("admin", "admin@admin.com", "admin")

Тогда вы можете создать суперпользователя с помощью python manage.py create_custom_superuser.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...