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)