Как сохранить сортировку на всех страницах на сайте Django?
Есть интернет-магазин, написанный с помощью Django. Есть товары по страницам и форма сортировки товара (по дате, цене и т.д). Заметил баг, как только я перехожу на любую другую страницу с первой страницы, вся сортировка пропадает и значение в форме меняется на изначальное. Как сохранить сортировку товара и значение формы на всех страницах ?
Вот полный код во views.py:
def product_list(request, category_slug=None):
category = None
categories = Category.objects.all()
products = Product.objects.filter(available=True)
sort_form = SortForm(request.POST)
if sort_form.is_valid():
need_sort = sort_form.cleaned_data.get("sort_form")
if need_sort == 'ПУ':
products = products.order_by('name')
elif need_sort == 'ДТ':
products = products.order_by('-created')
elif need_sort == "ДЕД":
products = products.order_by("price")
elif need_sort == "ДОД":
products = products.order_by("-price")
pages = Paginator(products, 6)
page_number = request.GET.get('page')
page_object = pages.get_page(page_number)
if category_slug:
category = get_object_or_404(Category, slug=category_slug)
products = products.filter(category=category)
sort_form = SortForm(request.POST)
if sort_form.is_valid():
need_sort = sort_form.cleaned_data.get("sort_form")
if need_sort == 'ПУ':
products = products.order_by('name')
elif need_sort == 'ДТ':
products = products.order_by('-created')
elif need_sort == "ДЕД":
products = products.order_by("price")
elif need_sort == "ДОД":
products = products.order_by("-price")
pages = Paginator(products, 6)
page_number = request.GET.get('page')
page_object = pages.get_page(page_number)
context = {'category': category, 'categories': categories, 'products': products, 'page_object':
page_object, 'sort_form': sort_form}
return render(request, 'shop/product_list.html', context)
Ответы (1 шт):
у тебя проблема в том, что сортировку ты устанавливаешь только в том случае, если были переданы данные ментодом POST в остальных случаях у тебя применяется сортировка по умолчанию. Соответственно можно испjльзовать два способа решения этой проблемы.
заменить обработку сортировки с метода POST на GET, передавать текущий метод сортировки в шаблон и к каждой ссылке в шаблоне дополнительно прописывать метод сортировки добавляя
?sort_form={{ current_sort }}При изменении сортировки дополнительно записывать текущую сортировку в значение переменной сессии и затем выдавать сортировку не на основе данных формы, а на основе того значения, что записан в сессии
так же я бы переработал product_list, что бы не дублировались строки по установке сортировки
def product_list(request, category_slug=None):
categories = Category.objects.all()
products = Product.objects.filter(available=True)
if category_slug:
category = get_object_or_404(Category, slug=category_slug)
products = products.filter(category=category)
else:
category = None
sort_form = SortForm(request.POST or None)
if request.POST:
if sort_form.is_valid():
request.session["need_sort"] = sort_form.cleaned_data.get("sort_form")
need_sort = request.session.get("need_sort")
if need_sort == 'ПУ':
products = products.order_by('name')
elif need_sort == 'ДТ':
products = products.order_by('-created')
elif need_sort == "ДЕД":
products = products.order_by("price")
elif need_sort == "ДОД":
products = products.order_by("-price")
pages = Paginator(products, 6)
page_number = request.GET.get('page')
page_object = pages.get_page(page_number)
context = {'category': category, 'categories': categories, 'products': products, 'page_object':
page_object, 'sort_form': sort_form}
return render(request, 'shop/product_list.html', context)