У меня есть функция, которая возвращает набор запросов и html-файл с результатами,
def get_queryset(self): # new
query = self.request.GET.get('q')
sort = '-date'
post_list = Post.objects.filter(
Q(title__icontains=query) #| Q(title__icontains=query) another field
).order_by(sort)
return post_list
форма:
<form class = "form-inline my-2 my-lg-0" action = "{% url 'search_results' %}" method = "get">
<input class = "form-control" name = "q" type = "text" placeholder = "חפש מאמרים">
<button class = "btn btn-outline-success my-sm-0" type = "submit">חפש</button>
</form>
В шаблоне для результатов я хочу, чтобы была пара ссылок для сортировки по дате, голосам и т.д...
Вы можете написать небольшую форму для получения, которая добавляет соответствующий заказ с помощью параметра запроса с именем order.
?order_by=-date
?order_by=score
?order_by=author
и получить их в представлении с request.GET.get("order_by")
или вы можете использовать библиотеку, например:
https://django-filter.readthedocs.io/en/stable/ref/filters.html
<a href = "127.0.0.1:8000/поиск/?q={{query}}/?order_by=-votes">отзывы</a>
Для нескольких параметров запроса это & не / ?foo=bar&abc=xyz
Пожалуйста, не допускайте произвольной сортировки: это уязвимость системы безопасности, поскольку пользователи могут сортировать, например, по полу автора Post
, которые могут быть данными, которые вы хотите защитить. Вы должны работать со списком приемлемых вариантов, поэтому:
def get_queryset(self):
query = self.request.GET.get('q')
sort = self.request.GET.get('order_by', '-date')
if sort not in ['date', '-date', 'votes', '-votes']:
sort = '-date'
return Post.objects.filter(
Q(title__icontains=query) | Q(title__icontains=query)
).order_by(sort)
Тогда URL-адрес должен выглядеть так:
<a href = "{% url 'search' %}?q = {{ query|urlencode }}&order_by=-votes">votes</a>
с 'search'
именем пути, который указывает на это представление.
Note: It might be worth to take a look at
django-filter
[GitHub] to do filtering based on aQueryDict
in a more declarative way.
Я сделал это, но тогда post_list нет