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