Как реализовать сортировку в django?

Хочу реализовать сортировку объектов по некоторым критериям. Сортировка, которую я написал, работает. Однако на моём сайте есть поиск, результаты которого пропадают, как только я использую ту самую сортировку. И по итогу я сортирую все объекты, а не только те, которые мне выдал поиск. Попытался исправить, написал пару "костылей" и всё же не получил желаемого результата.

Как правильно писать подобные вещи? Или быть может в django есть какое-то готовое решение?

views.py

class SearchResults(HomePage):
def get_queryset(self):
    query = self.request.GET.get('q')
    object_list = Product.objects.filter(Q(artist__icontains=query) | Q(album__icontains=query))

    return object_list

def get_context_data(self, *, object_list=None, **kwargs):
    context = super(SearchResults, self).get_context_data(**kwargs)
    context['query'] = self.request.GET.get('q')

    return context

class SortItems(HomePage):
def get_queryset(self):
    sort_types = {
        '0': '-time_create',
        '1': 'time_create',
        '2': 'price',
        '3': '-price',
    }

    sort_type = sort_types[self.kwargs['sort_type']]

    if 'query' in self.kwargs:
        query = self.kwargs['query']
        return super(SortItems, self).get_queryset().filter(Q(artist__icontains=query) |
                                                            Q(album__icontains=query)).order_by(sort_type)

    return super(SortItems, self).get_queryset().order_by(sort_type)

urls.py

urlpatterns = [
path('', HomePage.as_view(), name='home'),
path('search/', SearchResults.as_view(), name='search'),
path('sort/<str:sort_type>', SortItems.as_view(), name='sort'),
path('search/<str:query>/sort/<str:sort_type>', SortItems.as_view(), name='sort_search_results')]

template

<select onchange="location=value">
      {% if query %}
        <option value="{% url 'sort_search_results' query 0 %}">По умолчанию</option>
        <option value="{% url 'sort_search_results' query 1 %}">По дате</option>
        <option value="{% url 'sort_search_results' query 2 %}">Дешевле</option>
        <option value="{% url 'sort_search_results' query 3 %}">Дороже</option>

      {% else %}
        <option value="{% url 'sort' 0 %}">По умолчанию</option>
        <option value="{% url 'sort' 1 %}">По дате</option>
        <option value="{% url 'sort' 2 %}">Дешевле</option>
        <option value="{% url 'sort' 3 %}">Дороже</option>
      {% endif %}
    </select>
Вернуться на верх