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 = [ 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): 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'], + } 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 @@