【发布时间】: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