Django,Python:无法过滤具有传递值的产品 true 获取请求并订购产品

Django, Python: Can't filter products with passing values true the get request and order the products

我正在尝试过滤一些产品并按价格升序和降序对过滤后的产品进行排序。

这是我在视图中的代码:

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/
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

我研究了 Django 文档、google 和 SO,但没有找到解决方案。 我试图重新排列代码,将变量声明为全局变量,从 request.GET 参数中排除 'sort',但没有成功。

您收到 UnboundLocalError 错误,因为您没有为 if is_valid_queryparam(price_min):if is_valid_queryparam(price_max): 以及排序依据定义 else 块。因此,当您不应用过滤器时,paged_productsproduct_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)

我稍微更改了 Nahidur Ra​​hman 的代码以使最低价格过滤器起作用,有必要从最低价格开始查询并应用最高价格过滤器。

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)