Поле электронной почты Django Model является обязательным даже после того, как я установил его как null=True и blank=True

У меня проблема с полем email в модели django. Я установил его null True и blank True, но это не помешало пользовательским формам администратора или любым другим веб-формам, в которых я указываю email, не требовать email, если он указан пустым. Похоже, это связано с переопределением поля email в моей пользовательской модели, но я новичок в Django, поэтому не знаю, на что обратить внимание, чтобы устранить неполадки.

вот моя пользовательская модель пользователя с ее менеджером...

>`from django.contrib.auth.models import AbstractUser from django.db import models из django.utils.translation import gettext_lazy as _

from .managers import UserManager

class User(AbstractUser):

GENDER_CHOICES = (
    ('male', _('Male')),
    ('female', _('Female')),
    ('not_set', _('Not set')),
)

email = models.CharField(_('Email'), max_length=30, unique=True, blank=True, null=True)
phone = models.PositiveBigIntegerField(_('Phone number'), unique=True, null=True, blank=True)
telegram = models.BigIntegerField(_('Telegram ID'), unique=True, null=True, blank=True)

first_name = models.CharField(_('First name'), max_length=50, blank=True, null=True )
last_name = models.CharField(_('Last name'), max_length=50, blank=True, null=True )
middle_name = models.CharField(_('Middle name'), max_length=50, blank=True, null=True )
gender = models.CharField(_('Gender'), max_length=7, choices=GENDER_CHOICES, default='not_set')

profile_image = models.ImageField(_("Profile image"), upload_to='user/img/profile/', blank=True, null=True)
cover_image = models.ImageField(_("Cover image"), upload_to='user/img/cover/', blank=True, null=True)

user_verified_at = models.DateTimeField(_('User verified at'), null=True, blank=True)
phone_verified_at = models.DateTimeField(_('Phone verified at'), null=True, blank=True)
telegram_linked_at = models.DateTimeField(_('Telegram linked at'), null=True, blank=True)


USERNAME_FIELD = 'username'
REQUIRED_FIELDS = []

objects = UserManager()


class Meta:
    verbose_name = _("User")
    verbose_name_plural = _("Users")

def str(self):
    return str(self.username)
    

class ReservedUsername(models.Model): username = models.CharField(max_length=30, unique=True)

def str(self):
    return self.username

class Meta:
    verbose_name = _("Reserved Username")
    verbose_name_plural = _("Reserved Usernames")`

managers.py ` from django.contrib.auth.base_user import BaseUserManager

class UserManager(BaseUserManager):

use_in_migrations = True

def _create_user(self, username, password, **extra_fields):
    
    if not username:
        raise ValueError('Username is required')
    
    user = self.model(username=username, **extra_fields)
    user.set_password(password)
    user.save(using=self._db)
    return user
    
    
def create_user(self, username, password=None, **extra_fields):
    extra_fields.setdefault('is_staff', False)
    extra_fields.setdefault('is_superuser', False)
    extra_fields.setdefault('is_active', True)
    return self._create_user(username, password, **extra_fields)
    
    
def create_superuser(self, username, password, **extra_fields):
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_superuser', True)
    extra_fields.setdefault('is_active', True)

    if extra_fields.get('is_staff') is not True:
        raise ValueError('Superuser must be a staff')
    if extra_fields.get('is_superuser') is not True:
        raise ValueError('Superuser must be a superuser')
    
    return self._create_user(username, password, **extra_fields)`

Еще одна вещь... если вы можете помочь, мне нужно сделать managers.py более эффективным. Недавно я заметил, что любая проверка на длину имени пользователя, char regexp, который я там настроил, не действует нигде в проекте.

Заранее благодарю за ответ любого человека.

Я пытался установить поле электронной почты null=True, blank=True

Дважды проверьте свои формы; возможно, на уровне формы есть какая-то валидация, которая подхватывается. Кроме того, возможно, вам лучше использовать EmailField, а не CharField. Это дает доступ к EmailValidator.

Проблема :-

Я думаю, это потому, что unique=True. Поэтому два человека не могут поставить пустой email, потому что оба значения будут равны (''='').

Как, он стал

empty = empty .

Ответы :-

Я бы сказал,

1) чтобы удалить unique=True и использовать ограничение DB для сохранения уникальности и разрешения пустых значений. Если вы действительно хотите использовать CharField для этого.

Или

2) Используйте EmailField и удалите unique=True. Что более удобно, подходит и что построено для этого .


И обязательно удалите старые миграции БД и запустите makemigrations и migrate.

Спасибо.

Вернуться на верх