Frage

ich brauche Groß- und Kleinschreibung Abfragen auf username standardmäßig auszuführen wenn die Django Auth-Framework.

Ich habe versucht, das Problem zur Festlegung einer benutzerdefinierten Unterklasse von Queryset schreiben und Überschreiben des _filter_or_exclude Verfahrens und dann verwenden, Unterklasse in einem benutzerdefinierten Manager für die User-Modell -

from django.db.models import Manager
from django.db.models.query import QuerySet
from django.contrib.auth.models import UserManager

class MyQuerySet(QuerySet):
    def _filter_or_exclude(self, negate, *args, **kwargs):
        if 'username' in kwargs:
            kwargs['username__iexact'] = kwargs['username']
            del kwargs['username']
        return super(MyQuerySet, self)._filter_or_exclude(negate, *args, **kwargs)

class MyUserManager(UserManager):
    def get_query_set(self):
        return MyQuerySet(self.model)

User.objects = MyUserManager()

Aber dieser Ansatz nicht funktionierte und ich erhalte einen seltsamen Fehler, wenn ich versuchen User.objects.get(username='Foo') tun.

Jede mögliche Hilfe würde geschätzt.

Aktualisieren . Ich schließe den genauen Fehler, die ich erhalte

/usr/lib/python2.5/site-packages/django/db/models/query.py in get(self, *args, **kwargs)
    295         keyword arguments.
    296         """
--> 297         clone = self.filter(*args, **kwargs)
    298         num = len(clone)
    299         if num == 1:

/usr/lib/python2.5/site-packages/django/db/models/query.py in filter(self, *args, **kwargs)
    481         set.
    482         """
--> 483         return self._filter_or_exclude(False, *args, **kwargs)
    484 
    485     def exclude(self, *args, **kwargs):

/home/ghoseb/src/git/ocricket.git/ocricket/user/models.py in _filter_or_exclude(self, negate, *args, **kwargs)
     38             kwargs['username__iexact'] = kwargs['username']
     39             del kwargs['username']
---> 40         return super(MyQuerySet, self)._filter_or_exclude(negate, *args, **kwargs)
     41 
     42 class MyUserManager(UserManager):

/usr/lib/python2.5/site-packages/django/db/models/query.py in _filter_or_exclude(self, negate, *args, **kwargs)
    499             clone.query.add_q(~Q(*args, **kwargs))
    500         else:
--> 501             clone.query.add_q(Q(*args, **kwargs))
    502         return clone
    503 

/usr/lib/python2.5/django/db/models/sql/query.py in add_q(self, q_object, used_aliases)

/usr/lib/python2.5/django/db/models/sql/query.py in add_filter(self, filter_expr, connector, negate, trim, can_reuse, process_extras)

/usr/lib/python2.5/django/db/models/sql/query.py in get_meta(self)

<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute '_meta'

Aktualisieren :. Übrigens, ich wollte nur erwähnen, dass, wenn ich die Logik in meiner _filter_or_exclude Methode in die eigentliche QuerySet Klasse kopieren, es funktioniert einwandfrei

War es hilfreich?

Lösung

Die Manager können nicht in Klassen mit einfacher Attributierung (User.objects = MyManager()) hinzugefügt werden. Schauen Sie sich die Modelbase metaclass (db / models / base.py), um zu sehen, was alles für Sie hinter den Kulissen geschieht, wenn Sie Modellunterklasse.

Es soll möglich sein, um es mit User.add_to_class('objects', MyManager()) zu arbeiten. Alternativ können Sie eine Proxy-Unterklasse Benutzer und fügen Sie dort den Manager.

Andere Tipps

Sie möchten nicht mit internen Funktionen von Django Klassen zu verwirren. Auf diese Weise liegt Schwierigkeiten mit jedem Upgrade in der Zukunft.

Wenn Sie die Art, wie Menschen authentifizieren ändern möchten, schreiben Sie eine benutzerdefinierte Authentifizierungs-Backend.

Hier sind zwei Rezepte.

http: // www. davidcramer.net/code/224/logging-in-with-email-addresses-in-django.html

http://www.djangosnippets.org/snippets/577/

wir Beide statt Benutzername E-Mail. Es ist nicht schwer Groß- und Kleinschreibung Abfrage statt einer E-Mail-Abfrage zu verwenden.

Hier ist ein Rezept für die Auth-Use-Case: Django: Groß- und Kleinschreibung Abgleich von Benutzernamen von Auth Benutzer ? Sie sind wahrscheinlich am besten dran mit separaten Lösungen für jede Ihrer Anwendungsfälle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top