Estoy tratando de filtrar algunos productos y ordenar los productos filtrados por precio ascendente y descendente.
Este es mi código en la vista:
def is_valid_queryparam(param): return param != '' and param is not None def filter(request): if request.GET: price_min = request.GET.get('priceMin') price_max = request.GET.get('priceMax') sort_by = request.GET.get("sort", "l2h") if is_valid_queryparam(price_min): if sort_by == "l2h": products = Product.objects.filter(price__gte=price_min).order_by('price') elif sort_by == "h2l": products = Product.objects.filter(price__gte=price_min).order_by('-price') paginator = Paginator(products, 9) page = request.GET.get('page') paged_products = paginator.get_page(page) product_count = products.count() if is_valid_queryparam(price_max): if sort_by == "l2h": products = Product.objects.filter(price__lte=price_max).order_by('price') elif sort_by == "h2l": products = Product.objects.filter(price__lte=price_max).order_by('-price') paginator = Paginator(products, 9) page = request.GET.get('page') paged_products = paginator.get_page(page) product_count = products.count() else: products = Product.objects.all().order_by('price') paginator = Paginator(products, 9) page = request.GET.get('page') paged_products = paginator.get_page(page) product_count = products.count() context={ 'products': paged_products, 'product_count': product_count, } return render(request, 'store.html', context)Si trato de filtrar según el precio mínimo y máximo, funciona, pero cuando trato de ordenar o si no se aplica ningún filtro, aparece este UnboundLocalError:
UnboundLocalError at /store/ local variable 'paged_products' referenced before assignment Request Method: GET Request URL: http://127.0.0.1:8000/store/?sort=h2l Django Version: 3.1 Exception Type: UnboundLocalError Exception Value: local variable 'paged_products' referenced before assignment Exception Location: C:\Users\store\views.py, line 299, in filter Investigué la documentación de Django, Google y SO, pero no encontré una solución. Intenté reorganizar el código, declarar las variables como globales, excluir 'ordenar' de los parámetros request.GET y no tuve éxito.
Está recibiendo el error UnboundLocalError porque no ha definido un bloque else para if is_valid_queryparam(price_min): y if is_valid_queryparam(price_max): así como para ordenar por. Como resultado, cuando no aplica un filtro paged_products y product_count nunca se define y UnboundLocalError at /store/ local variable 'paged_products' referenced before assignment .
Pruebe el siguiente código a continuación que eliminará el problema y optimizará el código.
def is_valid_queryparam(param): return param != '' and param is not None def filter(request): if request.GET: price_min = request.GET.get('priceMin') price_max = request.GET.get('priceMax') sort_by = request.GET.get("sort", "l2h") if is_valid_queryparam(price_min): if sort_by == "l2h": products = Product.objects.filter(price__gte=price_min).order_by('price') elif sort_by == "h2l": products = Product.objects.filter(price__gte=price_min).order_by('-price') else: products = Product.objects.filter(price__gte=price_min) else: products = Product.objects.all().order_by('price') if is_valid_queryparam(price_max): if sort_by == "l2h": products = Product.objects.filter(price__lte=price_max).order_by('price') elif sort_by == "h2l": products = Product.objects.filter(price__lte=price_max).order_by('-price') else: products = Product.objects.filter(price__lte=price_max) else: products = Product.objects.all().order_by('price') else: products = Product.objects.all().order_by('price') paginator = Paginator(products, 9) page = request.GET.get('page') paged_products = paginator.get_page(page) product_count = products.count() context = { 'products': paged_products, 'product_count': product_count, } return render(request, 'store.html', context)Cambié ligeramente el código de Nahidur Rahman para que funcione el filtro de precio mínimo, es necesario tomar la consulta del precio mínimo y aplicar el filtro del precio máximo.
def is_valid_queryparam(param): return param != '' and param is not None def filter(request): if request.GET: price_min = request.GET.get('priceMin') price_max = request.GET.get('priceMax') sort_by = request.GET.get("sort", "l2h") if is_valid_queryparam(price_min): if sort_by == "l2h": products = Product.objects.filter(price__gte=price_min).order_by('price') elif sort_by == "h2l": products = Product.objects.filter(price__gte=price_min).order_by('-price') else: products = Product.objects.filter(price__gte=price_min) else: products = Product.objects.all().order_by('price') if is_valid_queryparam(price_max): if sort_by == "l2h": products = products.filter(price__lte=price_max).order_by('price') elif sort_by == "h2l": products = products.filter(price__lte=price_max).order_by('-price') else: products = products.filter(price__lte=price_max) else: products = products else: products = Product.objects.all().order_by('price') paginator = Paginator(products, 9) page = request.GET.get('page') paged_products = paginator.get_page(page) product_count = products.count() context = { 'products': paged_products, 'product_count': product_count, } return render(request, 'store.html', context)