如果默认情况下它们区分大小写,我该如何防止重复的用户名?

时间:2015-08-20 11:16:13

标签: python django validation username django-authentication

默认情况下,Django用户名区分大小写。显然,这是won't be fixed

这可能是一个很好的功能,特别是如果不允许其他角色。例如,我自己的用户名可能看起来像StringsOnFire更好。但是,默认情况下,无法为用户提供其用户名的唯一网址。

我想:

  • 允许在用户名
  • 中混合使用大写和小写字母
  • 仅在验证新用户名是唯一的时才忽略外壳
  • 保持contrib.auth用户模型不变

有哪些可能的解决方案?哪种方法最好?

3 个答案:

答案 0 :(得分:1)

您可以使用CustomUserManager并在create_user()方法中,执行不区分大小写的检查,以查看用户名是否已存在于iexact

答案 1 :(得分:1)

我想我有一个解决方案:

def clean_username(self):
    kwargs = {
        '{0}__{1}'.format(UsernameField(), 'iexact'): self.cleaned_data['username'],
    }
    if User.objects.filter(**kwargs):
        raise ValidationError(_('A user with that username already exists.'), code='invalid')
    return self.cleaned_data['username']

UsernameField()来自django-registration-redux。

如果这种方法有任何问题,请说出来!

答案 2 :(得分:0)

我使用django_registration(https://pypi.org/project/django-registration/)的RegistrationFormCaseInsensitive表单进行此操作

安装后:

在admin.py中:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    pass

使用以下方法创建forms.py:

from django_registration.forms import RegistrationFormCaseInsensitive
from .models import CustomUser


class CustomUserForm(RegistrationFormCaseInsensitive):
    class Meta(RegistrationFormCaseInsensitive.Meta):
        model = CustomUser

在urls.py中添加以下导入之一: 一步注册:

from django_registration.backends.one_step.views import RegistrationView

或通过邮件链接进行注册:

from django_registration.backends.activation.views import RegistrationView

,然后添加路径:

path("accounts/register/",
     RegistrationView.as_view(
         form_class=CustomUserForm,
         success_url="/"
     ), name="django_registration_register"),