Как реализовать сортировку в 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>