默认情况下,Django用户名区分大小写。显然,这是won't be fixed。
这可能是一个很好的功能,特别是如果不允许其他角色。例如,我自己的用户名可能看起来像StringsOnFire更好。但是,默认情况下,无法为用户提供其用户名的唯一网址。
我想:
contrib.auth
用户模型不变有哪些可能的解决方案?哪种方法最好?
答案 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"),