Django 模型电子邮件字段是必需的,即使我将其设置为 null=True 和空白=True

问题描述 投票:0回答:1

我在 django 模型中的电子邮件字段有问题。我已将其设置为 null True 和 Blank True,但这无法阻止管理员用户表单或任何其他包含电子邮件的 Web 表单,如果提交为空白则不需要电子邮件。似乎与我的自定义用户模型中的覆盖电子邮件字段有关,但我是 Django 新手,所以我不知道在哪里需要注意故障排除。

这是我的自定义用户模型及其管理器..

`从 django.contrib.auth.models 导入 AbstractUser 从 django.db 导入模型 从 django.utils.translation 导入 gettext_lazy as _

从.managers导入UserManager

用户类(抽象用户):

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)
    

类保留用户名(models.Model): 用户名 = models.CharField(max_length=30, unique=True)

def str(self):
    return self.username

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

经理.py ` 从 django.contrib.auth.base_user 导入 BaseUserManager

类用户管理器(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更有效率。我最近注意到对用户名长度的任何验证,我配置的字符正则表达式不会影响项目中的任何地方。

感谢您提前回复任何人。

我尝试设置电子邮件字段 null=True,blank=True

django django-models
1个回答
0
投票

仔细检查您的表格;表单级别上可能有某种验证正在被捕获。另外,您可能最好使用 EmailField 而不是 CharField。这可以访问EmailValidator

© www.soinside.com 2019 - 2024. All rights reserved.