سؤال

انا استخدم django-filter app، والذي يتعلق به هذا السؤال ولكن بعد كل شيء فهو إلى حد كبير python/Django عام.

ملخص بسيط لكيفية عمل التطبيق بشكل طبيعي:تقبل المرشحات lookup_type معامل.يتصرفون مثل أشكال جانغو، على سبيل المثال.

filters.py

class ProductFilter(django_filters.FilterSet):
    price = django_filters.NumberFilter(lookup_type='lt')

ثم views.py

from .filters import ProductFilter

def product_list(request):
    filtered_data = ProductFilter(request.GET, queryset=Product.objects.all())
    return render(request, 'template.html', {'f': filtered_data})

يعمل هذا بشكل جيد ولكن ماذا لو أردت أن يتمكن زائر الموقع من التحديد lookup_type صراحة وتصفية بناء على اختياره؟أحد الحلول التي توصلت إليها هو أخذ الكود بالكامل منه filters.py ل views.py:

def product_list(request):
    lookup_type_user = request.GET.get('lookup_type', 'exact')

    class ProductFilter(django_filters.FilterSet):
         price = django_filters.NumberFilter(lookup_type=lookup_type_user)

    filtered_data = ProductFilter(request.GET, queryset=Product.objects.all())
    # ...

يعمل هذا ولكني أرغب في الاحتفاظ بالكود في ملفات منفصلة.هل لديك أي أفكار ربما؟

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

المحلول

حدد وظيفة في وحدة التصفية الخاصة بك والتي تقوم بإنشاء فئة التصفية الخاصة بك.

def filter_factory(lookup_type):
    class ProductFilter(django_filters.FilterSet):
         price = django_filters.NumberFilter(lookup_type=lookup_type)

    return ProductFilter

ثم قم باستيراد filter_factory في وجهات نظرك.

from .filters import filter_factory

def product_list(request):
    lookup_type_user = request.GET.get('lookup_type', 'exact')
    ProductFilter = filter_factory(lookup_type_user)
    filtered_data = ProductFilter(request.GET, queryset=Product.objects.all())
    return render(request, 'template.html', {'f': filtered_data})
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top