为了账号安全,请及时绑定邮箱和手机立即绑定

Django注册表单中不区分大小写的用户名

Django注册表单中不区分大小写的用户名

12345678_0001 2021-10-10 14:27:32
这是我的注册表单,class SignupForm(forms.ModelForm):   class Meta:       model = User       fields = ['first_name', 'last_name','username', 'email', 'password']    def clean_username(self):        username = self.cleaned_data.get('username')        email = self.cleaned_data.get('email')        if username and User.objects.filter(username=username).exclude(email=email).count():            raise forms.ValidationError('This username has already been taken!')       return username这可以很好地检查是否存在相同的用户名。但是,它不检查不区分大小写。如果有一个用户名,例如“userone”,那么它也接受带有“Userone”的用户名。虽然它没有破坏任何功能,但看起来很不专业。我的问题是如何检查表单中不区分大小写的权利,并引发错误?
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

有时我遇到同样的问题。Django 认为用户名在小写或大写中是唯一的。就像如果我输入John,它是一个唯一的用户名,如果我输入john,它是一个新用户名。我需要考虑Johnjohn不是在数据库中。就像 facebook 一样简单,大写和小写的用户名都是相同的,唯一的。

所以我只是像这样更改我的注册代码来实现这一点。

username = self.cleaned_data.get('username').lower()

此外,在我的登录代码中,我将我的用户名转换为较低的。因此,它始终将用户名保存在数据库中,并使用小写用户名登录。尽管用户尝试使用大写的用户名登录,但它会通过转换为小写的方式保存到数据库中。


查看完整回答
反对 回复 2021-10-10
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

您可以在此处使用__iexact

User.objects.filter(username__iexact=username).exclude(email=email).exists()  # instead of count, used exists() which does not make any DB query



查看完整回答
反对 回复 2021-10-10
?
不负相思意

TA贡献1777条经验 获得超10个赞

我认为最简单的方法是:

使用 .exists() 方法,如果为 true 则验证错误否则返回 ❤


查看完整回答
反对 回复 2021-10-10
  • 3 回答
  • 0 关注
  • 352 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号