إخفاء عناصر التصفية التي تنتج صفرًا يؤدي إلى مرشح دانغو

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

سؤال

لدي مشكلة في تطبيق Django-Filter: كيفية إخفاء العناصر التي ستنتج نتائج صفر. أعتقد أن هناك طريقة بسيطة للقيام بذلك ، ولكن أتساءل كيف.

أنا أستخدم linkwidget على طراز cholechoicefilter ، مثل هذا:

provider = django_filters.ModelChoiceFilter(queryset=Provider.objects.all(), 
    widget=django_filters.widgets.LinkWidget) 

ما أحتاج إلى القيام به هو تصفية مجموعة QuerySet وتحديد فقط المزود الذي سيؤدي إلى نتيجة واحدة على الأقل ، واستبعاد الآخرين. هنالك طريقة لفعل لذلك؟

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

المحلول

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

f = SomeFilter(request.GET) 
f = SomeFilter(request.GET, queryset=f.qs)

الآن عندما يكون لديك QuerySet الصحيح ، يمكنك تجاوز مقدمي الخدمات ديناميكيًا فيه:

def __init__(self, **kw):
   super(SomeFilter, self).__init__(**kw)
   self.filters['provider'].extra['queryset'] = Provider.objects.filter(foo__in=self.queryset)

ليس جميلا لكنه يعمل. من المحتمل أن تقوم بتغليف هاتين المكالمتين في طريقة أكثر كفاءة على المرشح.

نصائح أخرى

ربما يمكن أن تكون QuerySet قابلة للاستدعاء بدلاً من كائن "حقيقي". بهذه الطريقة ، يمكن توليدها ديناميكيًا. على الأقل هذا يعمل في نماذج Django للإشارات إلى نماذج أخرى.

يمكن أن يكون القابل للاتصال طريقة فئة في نموذجك.

إذا فهمت سؤالك بشكل صحيح ، أعتقد أنك تريد استخدام AllvaluesFilter.

import django_tables

provider = django_filters.AllValuesFilter(
    widget=django_filters.widgets.LinkWidget)

يتوفر مزيد من المعلومات هنا: http://github.com/alex/django-filter/blob/master/docs/ref/filters.txt#l77

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