Django: регистронезависимое совпадение имени пользователя от пользователя auth?

Django по умолчанию реализует имя пользователя с учетом регистра, теперь для аутентификации я написал свой собственныйAuthentication Backend обрабатывать имена пользователей без учета регистра при аутентификации.

Как показано в :http://blog.shopfiber.com/?p=220

Теперь проблема заключается в следующем:

У меня есть различные взгляды и используемые методы, которые сравниваетusername в некоторые укусы.

то есть

request.user.username == username_from_some_other_system_as_str

Теперь, если имя пользователяyugal тогда:

request.user.username == 'Yugal' # Returns False

Теперь он должен вернутьсяTrue [Чего я хотел добиться]

За что я помню изC++ дней,Operator Overloading, Но я не думаю, что просто делать это для Джангоauth user было бы хорошей идеей, так какauth user тесно связан сdjango, Также перегрузка== сделает это без учета регистра для всего класса, а не только дляusername поле.

Итак, как я должен идти об этомusername нечувствительность к регистру, даже если сравнивать во всем.

Примечание:

Созданиеget_username метод, который возвращает имя пользователя в нижнем регистре, всегда невозможен, так как для его использования потребуется перефакторинг всего кода. Вы можете сделать это для своего кода один раз, но это невозможно, если вы используете сторонние приложения django.

я знаюuser.username.lower() = something.lower() возможно, но подвержено ошибкам, а не решение для записи чего-то, что так часто используется в настройке нескольких разработчиков.

я использовалSomeModel.objects.filter(username__iexact=username), где это возможно. Но это все еще оставляет систему уязвимой для ошибки любого неосведомленного разработчика.

======================================

Понял решение концептуально, но не смог заставить его работать (Справка):

####### Custom CharField for username case-insensitivity #######
from django.db.models.fields import CharField
class iUnicode:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        if isinstance(other, str) or isinstance(other, unicode):
            return self.value.lower() == other.lower()
        if isinstance(other, self.__class__):
            return other == self.value

    def __unicode__(self):
        return unicode(self.value)
    def __str__(self):
        return self.__unicode__()


class UsernameCharField(CharField):
    def to_python(self, value):  # Its not getting called
        unicode_val = super(CharField, self).to_python(value)
        return iUnicode(unicode_val)

if User._meta.local_fields[1].name == 'username':
    User._meta.local_fields[1] = UsernameCharField(max_length=30)
    User._meta.local_fields[1].model = User
################################################################

Я предполагаюto_python используется для преобразования значения, полученного из базы данных вunicode в питоне. Но я думаю, мойto_python не вызывается.

Это также обеспечит нечувствительность к регистру в сторонних приложениях и не потребует повторного факторинга. Это исправитUser в его ядре. Я буду добавлять это к__init__.py моего первогоINSTALLED_APP

Что я делаю неправильно ?

Ответы на вопрос(6)

Ваш ответ на вопрос