Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django-- Case insensitive username

Before anybody marks it as duplicate, I know there are tons of similar or exactly same question, but none of the solution seemed to work for me and I am clueless.

As usual I want my User model from django.contrib.auth.models to have case insensitive username. I have tried both methods described here. Unfortunately none of those worked for me. Do I also need to edit my views.py after going through one the method described in the link? what should I do to achieve case insensitiveness?

Here is my view

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

Here is part of my 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()

EDIT: For option 1 from the link I get following error while making migration:

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

Option 2 throws no error but if i create a user with username "User" and try to login with username "user", it gives "user doesn't exist" error.

like image 931
mango Avatar asked May 09 '26 07:05

mango


1 Answers

You can try something like this

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')
like image 174
shubham003 Avatar answered May 11 '26 05:05

shubham003