@madnober

Как реализовать сортировку в 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>
  • Вопрос задан
  • 533 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы