【问题标题】:how customize User validator to accept whitespaces如何自定义用户验证器以接受空格
【发布时间】:2020-12-12 22:30:03
【问题描述】:

我想对用户进行自定义验证,以创建名称中带有空格的名称用户。我这样做如下,但是,我创建了 User2 并更改了正则表达式,但它没有更改验证条件,它不起作用。有没有人知道为什么或如何而不是我能做到?

型号

from django.utils.translation import gettext_lazy as _

from django.contrib.auth.models import User
from django.contrib.auth.validators import UnicodeUsernameValidator


class MyUnicodeUsernameValidator(UnicodeUsernameValidator):
    print('test My')
    regex = r'^[\d]'
    message = _(
        'Enter a valid username. This value may contain only letters, '
        'numbers, and @/./+/-/_ characters.'
    )
    flags = 0


class User2(User):
    username_validator = MyUnicodeUsernameValidator()
    print(username_validator)

查看

from django.shortcuts import render, get_object_or_404
from .models import User2
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import logout
from blog.models import Article




class MyUserCreationForm(UserCreationForm):
    class Meta:
        model = User2
        fields = ("username",)

def sign_up(request):
    context = {}

    form = MyUserCreationForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            form.save()
            return render(request, 'accounts/index.html')
    context['form'] = form
    return render(request,'registration/sign_up.html', context)

【问题讨论】:

  • 您创建了一个新的验证器,并将其作为类属性附加,但这不会更改现有字段的验证...
  • 此外,因为User 不是抽象模型,您现在有两个表:一个表只有一个ForeignKeyUser2UserUser 模型。跨度>

标签: django validation django-models customization


【解决方案1】:

由于多种原因,这种方法行不通。第一个是你在这里创建一个子类,它将被实现为一个子模型:一个没有字段的额外模型。但即使User 是一个抽象模型,它也行不通。 User 模型有一个 username field [GitHub] 和一个验证器:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    # …
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )

但这不是在类级别对username_validator 的“间接引用”:对UnicodeUsernameValidator 对象的引用,因此即使您更改了验证器,也确实如此不会更改已构建的字段。

我认为实现这一点的最佳方式是Specifying a custom user model [Django-doc]。制作将用作用户模型的用户模型。您因此定义了一个类:

from django.contrib.auth.base_user import AbstractBaseUser

class MyUser(AbstractBaseUser):
    username_validator = MyUnicodeUsernameValidator()
    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text='Some helptext that describes what are valid usernames',
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    # …

然而,定义其他字段、经理等需要额外的工作(文档中指定的步骤)。

虽然您可以这样做,但在用户名中允许空格可能不是一个好主意。有时在 URI 中使用用户名,并且由于空格被百分比编码为 %20,这将导致“ugly”URI。

【讨论】:

  • 这个项目我把它当作一个教训来了解一些事情。我使用您的建议和示例来获得我自己的意见,这样做是值得的,但也要付出“丑陋”网址的代价。再次感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多