جانغو: إجراء عمليات البحث تحسس حالة الأحرف افتراضيا

StackOverflow https://stackoverflow.com/questions/531892

سؤال

ولست بحاجة إلى تنفيذ استعلامات تحسس حالة الأحرف على username افتراضيا عند استخدام إطار جانغو مصادقة.

وحاولت إصلاح المشكلة عن طريق كتابة فئة فرعية مخصصة من Queryset وتجاوز أسلوب _filter_or_exclude ومن ثم استخدام تلك فرعية في مدير مخصص للنموذج المستخدم -

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

ولكن هل هذا النهج لا تعمل وأنا على الحصول على خطأ غريب عندما محاولة القيام User.objects.get(username='Foo').

وسيكون موضع تقدير أي مساعدة.

على تحديث : في. أنا بما الخطأ الدقيق الذي أنا على الحصول على

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

على تحديث : في. وبالمناسبة، أنا فقط أردت أن أذكر أنني عندما نسخ المنطق داخل بلدي طريقة _filter_or_exclude إلى الطبقة QuerySet الفعلية، وأنها تعمل على خير ما يرام

هل كانت مفيدة؟

المحلول

لا يمكن إضافة مدراء إلى الطبقات مع تعيين السمة بسيط (User.objects = MyManager()). نظرة على metaclass ModelBase (ديسيبل / نماذج / base.py) لمعرفة كل ما يتم بالنسبة لك وراء الكواليس عند فئة فرعية نموذج.

ويجب أن تكون قادرة على العمل على انجاحه مع User.add_to_class('objects', MyManager()). بدلا من ذلك، يمكن إجراء وكيل فرعية من المستخدم وإضافة مدير هناك.

نصائح أخرى

وأنت لا تريد الفوضى مع ميزات الداخلية للفصول جانغو. بهذه الطريقة تكمن مشكلة مع كل ترقية في المستقبل.

إذا كنت تريد تغيير طريقة الناس مصادقة، وكتابة الخلفية المصادقة المخصصة.

وهنا نوعان من صفات.

HTTP: // شبكة الاتصالات العالمية. davidcramer.net/code/224/logging-in-with-email-addresses-in-django.html

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

وكلا هذين لنا البريد الإلكتروني بدلا من اسم المستخدم. ليس من الصعب استخدام استعلام حالة الأحرف بدلا من استعلام البريد الإلكتروني.

وهنا وصفة لحالة استخدام المصادقة: جانغو: حالة مطابقة حساسة من اسم المستخدم من مستخدم مصادقة ؟ وربما كنت أفضل حالا باستخدام حلول منفصلة لكل من حالات الاستخدام الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top