【问题标题】:Django, Python: Can't filter products with passing values true the get request and order the productsDjango,Python:无法过滤具有传递值的产品真正获取请求并订购产品
【发布时间】:2022-01-13 05:46:31
【问题描述】:

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

这是我在视图中的代码:

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 参数中排除“排序”,但没有成功。

【问题讨论】:

    标签: javascript python html django django-views


    【解决方案1】:

    您收到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)
    

    【讨论】:

      【解决方案2】:

      我稍微更改了 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)
      

      【讨论】:

        猜你喜欢
        • 2011-08-03
        • 1970-01-01
        • 2017-04-16
        • 1970-01-01
        • 2017-10-18
        • 2021-01-25
        • 2016-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多