Как сохранить сортировку на всех страницах на сайте 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 шт):

Автор решения: Andrey Maslov

у тебя проблема в том, что сортировку ты устанавливаешь только в том случае, если были переданы данные ментодом POST в остальных случаях у тебя применяется сортировка по умолчанию. Соответственно можно испjльзовать два способа решения этой проблемы.

  1. заменить обработку сортировки с метода POST на GET, передавать текущий метод сортировки в шаблон и к каждой ссылке в шаблоне дополнительно прописывать метод сортировки добавляя ?sort_form={{ current_sort }}

  2. При изменении сортировки дополнительно записывать текущую сортировку в значение переменной сессии и затем выдавать сортировку не на основе данных формы, а на основе того значения, что записан в сессии

так же я бы переработал 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)
→ Ссылка