أخذ تعليمات برمجية غير ذات صلة من موقع view.py
-
26-12-2019 - |
سؤال
انا استخدم 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})
لا تنتمي إلى StackOverflow