جانغو: إجراء عمليات البحث تحسس حالة الأحرف افتراضيا
-
22-08-2019 - |
سؤال
ولست بحاجة إلى تنفيذ استعلامات تحسس حالة الأحرف على 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://www.djangosnippets.org/snippets/577/
وكلا هذين لنا البريد الإلكتروني بدلا من اسم المستخدم. ليس من الصعب استخدام استعلام حالة الأحرف بدلا من استعلام البريد الإلكتروني.
وهنا وصفة لحالة استخدام المصادقة: جانغو: حالة مطابقة حساسة من اسم المستخدم من مستخدم مصادقة ؟ وربما كنت أفضل حالا باستخدام حلول منفصلة لكل من حالات الاستخدام الخاص بك.