【问题标题】:AttributeError: module 'django.db.models' has no attribute 'RegexField'. python (django)AttributeError:模块“django.db.models”没有属性“RegexField”。蟒蛇(django)
【发布时间】:2020-05-08 15:52:20
【问题描述】:

我想添加 RegexField 但我有这个错误。为什么? 在 Google 上找到它,但在 regexfield 上没有任何内容

这是错误

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

模型.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() 

【问题讨论】:

  • RegexFieldformfield,而不是模型字段。正则表达式在表单中验证,而不是在模型中。
  • @WillemVanOnsem 如何在 forms.py 中修复?

标签: python django django-models django-forms django-3.0


【解决方案1】:

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

可以做的是将RegexValidator [Django-doc] 作为验证器添加到您的模型字段:

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()

开始,您还可以使用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__'

【讨论】:

  • 谢谢,还有写的信?我只希望数字是
  • @kokiwebaa:这些数字是什么意思。如果您通过表单输入数据(表单将调用.clean_fields 并运行验证器),则将验证正则表达式。因此,如果确实包含非数字字符(不是+),则会引发错误。事实上RegexField只是一个CharField,它添加了一个验证器,所以RegexField没有什么“特别”,它基本上是一个“捷径”。
  • 我只想要电话号码,不要字母
  • @kokiwebaa: 好吧,这将通过表单进行检查......因为我们向CharField 的验证器添加了RegexValidator。因此,如果您在输入字段中输入foo,那么表单将拒绝它。
猜你喜欢
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 2019-07-20
  • 2019-09-30
  • 2020-12-22
相关资源
最近更新 更多