Поле электронной почты 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.
Спасибо.