【问题标题】:Django-- Case insensitive usernameDjango——不区分大小写的用户名
【发布时间】:2017-06-26 12:37:42
【问题描述】:

在有人将其标记为重复之前,我知道有大量相似或完全相同的问题,但似乎没有一个解决方案对我有用,我一无所知。

像往常一样,我希望来自 django.contrib.auth.models 的用户模型具有不区分大小写的用户名。我已经尝试了here 描述的两种方法。不幸的是,这些都不适合我。在完成链接中描述的一种方法后,我是否还需要编辑我的views.py?我应该怎么做才能实现不区分大小写?

这是我的看法

def login_page(request):
if(request.method == 'POST'):
    name = request.POST['user']
    if not User.objects.filter(username=name).exists():
        return render(request, 'login.html', {'error_user': 'user does not exist'})
    pwd = request.POST['pwd']
    user = authenticate(username=name, password=pwd)

    if user is not None:
        login(request, user)
        return redirect('index')
    else:
        return render(request, 'login.html', {'error_pwd': name})

else:
    return render(request, 'login.html')

这是我的models.py的一部分:

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()


class ContentItem(models.Model):
    upload_date = models.DateTimeField(auto_now=True)
    title = models.CharField(max_length=100, default='no title')
    description = models.CharField(max_length=400, default='no description')
    image = models.ImageField(upload_to='image_board/posts/', 
    default='null')
    uploaded_by = models.ForeignKey(User, default='0')

    def __str__(self):
        return self.title

    def get_likes(self):
        no = self.like_set.all().count()
        if no is not None:
        return no
    else:
        return 0


class Profile(models.Model):
    user = models.OneToOneField(User, 
    related_name='profile',on_delete=models.CASCADE)
    #email = models.EmailField()
    #first_name = models.CharField(max_length=20, blank=True)
    #last_name = models.CharField(max_length=20, blank=True)
    personal_info = models.TextField(blank=True)
    job_title = models.CharField(max_length=100, blank=True)
    department = models.CharField(max_length=100, blank=True)
    location = models.CharField(max_length=100, blank=True)
    expertise = models.TextField(blank=True)
    phone_regex = RegexValidator(regex=r'^\+?1?\d{5,15}$', message="Phone 
  number must be entered in the format: '+123456'. Between 5 and 15 digits 
  allowed.")
    phone_number = models.CharField(validators=[phone_regex], max_length=16, 
blank=True)
contact_skype = models.URLField(null=True, blank=True)
contact_facebook = models.URLField(null=True, blank=True)
contact_linkedin = models.URLField(null=True, blank=True)
user_photo = models.ImageField(upload_to='../media/img', 
default='../media/img/anon.png')

def __str__(self):
    return self.job_title

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save()

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

编辑:对于链接中的选项 1,我在进行迁移时遇到以下错误:

File "C:\Anaconda3\lib\site-packages\django-1.11-py3.4.egg\django\contrib\auth\__init__.py", line 194, in get_user_model
    "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
 django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 
'core.CustomUser' that has not been installed

选项 2 不会引发错误,但如果我使用用户名“User”创建用户并尝试使用用户名“user”登录,则会出现“用户不存在”错误。

【问题讨论】:

  • 你的应用名称是什么?
  • image_board,为什么这很重要?我的 backends.py 在项目文件夹中,而不是在 app 文件夹中。有什么区别吗?
  • 但是,您的CustomUser 模型在image_board 应用程序中吗?
  • 你试过User.objects.filter(username__iexact=name).exists()
  • 确实如此。

标签: django authentication django-models


【解决方案1】:

你可以试试这样的

def login_page(request):
    if(request.method == 'POST'):
        name = request.POST['user']
        temp_user = User.objects.filter(username__iexact=name)
        if not temp_user.exists():
            return render(request, 'login.html', {'error_user': 'user does not exist'})
        pwd = request.POST['pwd']
        user = authenticate(username=temp_user.username, password=pwd)

        if user is not None:
            login(request, user)
            return redirect('index')
        else:
            return render(request, 'login.html', {'error_pwd': name})

    else:
        return render(request, 'login.html')

【讨论】:

    【解决方案2】:

    在您的settings.py 中,AUTH_USER_MODEL 应该是一个包含类似 '<your_app_name>.CustomUser' 的字符串。

    您是否检查过您的应用名称是'core'

    编辑

    也许尝试更改您的 Profile 模型,

    from django.conf import settings
    
    user = models.OneToOneField(settings.AUTH_USER_MODEL, 
    related_name='profile',on_delete=models.CASCADE)
    

    【讨论】:

    • 好的,我更正了。现在我收到以下错误。 image_board.Profile.user:(fields.E301)字段定义了与模型“auth.User”的关系,该模型已被换出。提示:更新指向“settings.AUTH_USER_MODEL”的关系。
    • 你有没有尝试按照这个提示?
    • 错误可能在您的Profile 模型中,该模型具有指向django.contrib.auth.User 的链接。将链接更改为settings.AUTH_USER_MODEL。如果你发布你的模型,那就容易多了。
    • 编辑了答案,没试过。但是一定要试一试!
    • 对不起,如果我遗漏了非常基本的东西,但现在我得到“字段 image_board.Profile.user 是用对 'image_board.customuser' 的惰性引用声明的,但应用程序 'image_board' 没有提供模型'customuser'。"
    猜你喜欢
    • 2020-10-19
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多