首页 > 解决方案 > 如何在 Dnago 中使用户名字段不区分大小写?我的实施正确吗?

问题描述

我正在使用 Django 和 Django Rest Framework 开始我的 Web 项目。我希望我的用户名字段不区分大小写,因此我在网上搜索了如何实现它并访问了这个漂亮的博客:https ://simpleisbetterthancomplex.com/tutorial/2017/02/06/how-to-implement-case-不敏感的用户名.html。他提出了这个方法:

from django.contrib.auth.models import AbstractUser, UserManager

class CustomUserManager(UserManager):
    def get_by_natural_key(self, username):
        case_insensitive_username_field = '{}__iexact'.format(self.model.USERNAME_FIELD)
        return self.get(**{case_insensitive_username_field: username})

class CustomUser(AbstractUser):
    objects = CustomUserManager()

对于模型.py

但是当我编写测试时,它们失败了,因为当我创建两个用户名相同但大小写不同的用户时,User.objects.get_by_natural_key 返回了两个用户对象(例如:'aniket' 和 'Aniket')。

所以,我通过了这种方法:

from django.contrib.auth.models import UserManager, AbstractUser
# Create your models here.


class CustomUserManager(UserManager):
    def create_user(self, username, email=None, password=None, **extra_fields):
        return super().create_user(username.lower(),email,password,**extra_fields)

    def create_superuser(self, username, email, password, **extra_fields):
        return super().create_superuser(username.lower(),email,password,**extra_fields)

    def get_by_natural_key(self, username):
        case_insensitive_username_field = '{}__iexact'.format(self.model.USERNAME_FIELD)
        return self.get(**{case_insensitive_username_field: username})

class User(AbstractUser):
    objects = CustomUserManager()

那么,这种方法是否符合要求?

标签: pythondjango

解决方案


推荐阅读