2014-12-28 31 views
3

我试图做一个Django应用程序不区分大小写的登录,而不会改变原来的用户名大小写。根据我的研究,最好的方法是创建一个相关字段,以在注册时以小写形式存储用户名。没有重新创建用户模型,这是一个简单的解决方案,对吧?我的困境:如何从一个模型中获取数据并进行更改,并在创建该对象时将其保存在另一个模型中?Django不区分大小写的登录,混合大小写用户名

这里是在models.py

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

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    lc_n = User.username 
    lc_n = lc_n.lower() 
    lowercase_name = models.CharField(max_length=30, default=lc_n) 

当运行python manage.py makemigrations存在以下错误:

AttributeError: type object 'User' has no attribute 'username'

用户确实有属性,但它可以”以这种方式访问​​。

请原谅我,因为这必须包含一些简单的基本缺陷。任何可能提供的支持将不胜感激。

回答

8

您不需要任何其他模型来实现不区分大小写的登录。 Django支持不区分大小写筛选iexact运算符:

user = User.objects.get(username__iexact=name) 
+0

我确实找到了一个使用这种非常方法的示例。在这个例子下面的评论中,有人说:“这不会在用户名上使用Django的索引,而是会对数据库执行一次seqscan,这对很多用户来说非常缓慢。您应该在创建时创建索引或小写所有用户名,搜索这些。“我在这里很无知,所以我接受了他的话。他的陈述是正确的吗? http://www.shopfiber.com/case-insensitive-username-login-in-django/ – codingcoding

+0

回想起来,您的解决方案确实只查询用户名索引,并且非常简单。似乎我早些时候引用的那个人可能在我之外制造了一个巨魔餐。 – codingcoding

+2

我正在使用Django 1.7,django-registration-redux扩展,它已经可以防止重复的,不同的用户名,所以没有问题。在BaseUserManager类的django/contrib/auth/models.py中,我将get_by_natural_key()设置为'return self.get(username__iexact = username)',它运行良好。谢谢! – codingcoding