Django, Python: Невозможно отфильтровать товары с передачей значений true в запросе get и заказать товары

Я пытаюсь отфильтровать некоторые продукты и упорядочить отфильтрованные продукты по цене по возрастанию и убыванию.

Вот мой код в представлении:

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)

Если я пытаюсь фильтровать на основе минимальной и максимальной цены, это работает, но когда я пытаюсь сортировать или если фильтр не применяется, я получаю эту UnboundLocalError:

UnboundLocalError at /store/ локальная переменная 'paged_products' ссылается до присвоения Метод запроса: GET URL запроса: http://127.0.0.1:8000/store/?sort=h2l. Версия Django: 3.1 Тип исключения: UnboundLocalError Значение исключения:
локальная переменная 'paged_products' упоминается до присвоения Местоположение исключения: C:\Users\store\views.py, строка 299, в filter

Я изучил документацию django, google и SO, но не нашел решения. Я пытался перестроить код, исключить 'sort' из параметров request.GET, но безрезультатно.

Вы получаете ошибку UnboundLocalError, потому что не определили блок else для if is_valid_queryparam(price_min): и if is_valid_queryparam(price_max):, а также для сортировки по. В результате, когда вы не применяете фильтр, paged_products и product_count никогда не определяются и вызывают ошибки UnboundLocalError at /store/ local variable 'paged_products' referenced before assignment.

Попробуйте следующий код, который устранит проблему, а также оптимизирует код.

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)

Я немного изменил код Нахидура Рахмана, чтобы фильтр по минимальной цене работал, необходимо взять запрос по минимальной цене и применить фильтр по максимальной цене.

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)
Вернуться на верх