From c836f596a4b12601b9f31da54fc5fa5aaf440c08 Mon Sep 17 00:00:00 2001 From: Asif Islam Date: Thu, 26 Jun 2025 19:22:41 +0600 Subject: [PATCH 1/4] Add django_filters package to project settings --- DjangoEcommerce/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/DjangoEcommerce/settings.py b/DjangoEcommerce/settings.py index f9879db..fec4495 100644 --- a/DjangoEcommerce/settings.py +++ b/DjangoEcommerce/settings.py @@ -39,6 +39,7 @@ 'django.contrib.messages', 'django.contrib.staticfiles', 'DjangoEcommerceApp', + 'django_filters', ] MIDDLEWARE = [ From 8e906162b079a934a24587e9da683f77cfbd9e91 Mon Sep 17 00:00:00 2001 From: Asif Islam Date: Thu, 26 Jun 2025 20:00:52 +0600 Subject: [PATCH 2/4] Add filters to handle filtering --- DjangoEcommerceApp/filters.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 DjangoEcommerceApp/filters.py diff --git a/DjangoEcommerceApp/filters.py b/DjangoEcommerceApp/filters.py new file mode 100644 index 0000000..b205251 --- /dev/null +++ b/DjangoEcommerceApp/filters.py @@ -0,0 +1,23 @@ +import django_filters +from DjangoEcommerceApp.models import Products, SubCategories + +class ProductFilter(django_filters.FilterSet): + subcategories_id=django_filters.ModelChoiceFilter( + queryset=SubCategories.objects.all(), + label='Subcategory' + ) + + search=django_filters.CharFilter( + field_name='product_name', + lookup_expr='icontains', + label='Search Product' + ) + + class Meta: + model = Products + fields = { + 'subcategories_id':['exact'], + 'brand':['icontains'], + 'product_max_price':['lte', 'gte'], + 'product_discount_price':['lte', 'gte'], + } From 13e1c095986d4b4ee6b20955300604139dddd277 Mon Sep 17 00:00:00 2001 From: Asif Islam Date: Thu, 26 Jun 2025 20:01:20 +0600 Subject: [PATCH 3/4] Add django-filter integration for product filtering --- DjangoEcommerceApp/AdminViews.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/DjangoEcommerceApp/AdminViews.py b/DjangoEcommerceApp/AdminViews.py index 6858325..794edd5 100644 --- a/DjangoEcommerceApp/AdminViews.py +++ b/DjangoEcommerceApp/AdminViews.py @@ -10,6 +10,8 @@ from django.db.models import Q from DjangoEcommerce.settings import BASE_URL from django.views.decorators.csrf import csrf_exempt +from .filters import ProductFilter +from django.db.models import Prefetch @login_required(login_url="/admin/") def admin_home(request): @@ -194,7 +196,6 @@ def get(self,request,*args,**kwargs): categories_list.append({"category":category,"sub_category":sub_category}) merchant_users=MerchantUser.objects.filter(auth_user_id__is_active=True) - return render(request,"admin_templates/product_create.html",{"categories":categories_list,"merchant_users":merchant_users}) def post(self,request,*args,**kwargs): @@ -264,28 +265,28 @@ class ProductListView(ListView): paginate_by=3 def get_queryset(self): - filter_val=self.request.GET.get("filter","") + self.filterset = ProductFilter(self.request.GET, queryset=super().get_queryset()) order_by=self.request.GET.get("orderby","id") - if filter_val!="": - products=Products.objects.filter(Q(product_name__contains=filter_val) | Q(product_description__contains=filter_val)).order_by(order_by) - else: - products=Products.objects.all().order_by(order_by) - - product_list=[] - for product in products: - product_media=ProductMedia.objects.filter(product_id=product.id,media_type=1,is_active=1).first() + products=self.filterset.qs.order_by(order_by) + media_qs=ProductMedia.objects.filter(media_type=1, is_active=1) + prefetched_products=products.prefetch_related( + Prefetch('productmedia_set', queryset=media_qs, to_attr='filtered_media') + ) + + product_list = [] + for product in prefetched_products: + product_media=product.filtered_media[0] if product.filtered_media else None product_list.append({"product":product,"media":product_media}) return product_list def get_context_data(self,**kwargs): context=super(ProductListView,self).get_context_data(**kwargs) - context["filter"]=self.request.GET.get("filter","") context["orderby"]=self.request.GET.get("orderby","id") context["all_table_fields"]=Products._meta.get_fields() + context["all_subCategories"]=SubCategories.objects.all() return context - class ProductEdit(View): def get(self,request,*args,**kwargs): From a70ca742106fb147b2da4ba7d703d712c185e8bb Mon Sep 17 00:00:00 2001 From: Asif Islam Date: Thu, 26 Jun 2025 20:07:47 +0600 Subject: [PATCH 4/4] Add filter button functionality --- .../admin_templates/product_list.html | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/DjangoEcommerceApp/templates/admin_templates/product_list.html b/DjangoEcommerceApp/templates/admin_templates/product_list.html index 463526e..84a9622 100644 --- a/DjangoEcommerceApp/templates/admin_templates/product_list.html +++ b/DjangoEcommerceApp/templates/admin_templates/product_list.html @@ -20,7 +20,7 @@
- +
@@ -32,12 +32,25 @@
-
Sort By : - - ID | - Title | - Description + ID | + Title | + Description +
+
@@ -83,15 +96,15 @@