属性错误:模块'django.db.models'没有属性'RegexField',Python(Django)

t5zmwmid  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(159)

我想添加RegexField,但我有这个错误。为什么?在Google上找到了,但在Regexfield上没有

这是错误
mob = models.RegexField(regex=r'^+?1?\d{9,15}$')AttributeError:模块'django.db.models'没有属性'RegexField'

models.py

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

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 = None
    email = models.EmailField(_('email address'), unique=True)
    mob = models.RegexField(regex=r'^\+?1?\d{9,15}$')

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()
j8ag8udp

j8ag8udp1#

RegexField[Django-doc]是一个 form 字段。您可以在表单中使用它来验证文本,然后再将其存储到模型中,但不能存储到 model 中。

你可以做的是添加一个**RegexValidator**[Django-doc]作为验证器到你的model字段:

from django.core.validators import RegexValidator

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

    username = None
    email = models.EmailField(_('email address'), unique=True)
    mob = models.CharField(
        max_length=17,
        validators=[RegexValidator(r'^\+?1?\d{9,15}$')]
    )

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

django-2.2开始,您还可以使用constraint framework [Django-doc]在数据库层验证约束。并不是所有的数据库本身都会检查约束,所以不能保证在数据库层验证它。可以使用以下命令定义约束:

from django.db.models import Q
from django.core.validators import RegexValidator

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

    username = None
    email = models.EmailField(_('email address'), unique=True)
    mob = models.CharField(
        max_length=17,
        validators=[RegexValidator(r'^\+?1?\d{9,15}$')]
    )

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=Q(mob__regex=r'^\+?1?\d{9,15}$'),
                name='mob_valid'
            ),
        ]

您还可以使用RegexField定义表单,但如果添加验证器,则不需要。例如,在表单中,您可以添加:

from django import forms

class UserForm(forms.ModelForm):
    mob = forms.RegexField(regex=r'^\+?1?\d{9,15}$')

    class Meta:
        model = User
        fields = '__all__'

相关问题