В настоящее время я пытаюсь найти решение моей проблемы. Таким образом, у меня есть URL-адрес, который так:Фильтрация и заказ на основе нескольких параметров request.GET
https://www.domain.com/forum/topic/
На мой взгляд, шаблон, у меня есть форма и вход, который отвечает за поиск постов:
<form method="GET" action="">
<div class="input-group">
<input type="text" name="q" placeholder="Search..." value="{{ request.GET.q }}" class="form-control">
<span class="input-group-btn">
<input class="btn btn-secondary" type="submit" value="Search">
</span>
</div>
</form>
В моих Просмотров .py поиск действует следующим образом:
def discussion(request, discussion):
topics_list = Topic.objects.all().filter(discussion__url=discussion)
discussion = Discussion.objects.get(url=discussion)
search_query = request.GET.get('q')
if search_query:
topics_list = topics_list.filter(
Q(title__icontains=search_query) |
Q(user__username__icontains=search_query)
)
paginator = Paginator(topics_list, 10)
page = request.GET.get('page')
try:
topics = paginator.page(page)
except PageNotAnInteger:
topics = paginator.page(1)
except EmptyPage:
topics = paginator.page(paginator.num_pages)
context = {'topics': topics, 'discussion': discussion,}
return render(request, 'forum/forum_show_posts.html', context)
Теперь, когда я запускаю поиск Он отлично работает, он на самом деле фильтр s объекты, основанные на мой запрос, что делает URL выглядеть следующим образом:
https://www.domain.com/forum/topic/?q=test
Теперь я хочу работать на заказ по моим объектам, поэтому я продолжил изменить вид дискуссионный быть:
def discussion(request, discussion):
topics_list = Topic.objects.all().filter(discussion__url=discussion)
discussion = Discussion.objects.get(url=discussion)
search_query = request.GET.get('q')
sort_query = request.GET.get('sort')
if search_query:
topics_list = topics_list.filter(
Q(title__icontains=search_query) |
Q(user__username__icontains=search_query)
)
elif sort_query:
if sort_query == "newest":
topics_list = topics_list.order_by('-timestamp')
if sort_query == "oldest":
topics_list = topics_list.order_by('timestamp')
if sort_query == "name":
topics_list = topics_list.order_by('title')
# sort_query = sort_query.title()
paginator = Paginator(topics_list, 10)
page = request.GET.get('page')
try:
topics = paginator.page(page)
except PageNotAnInteger:
topics = paginator.page(1)
except EmptyPage:
topics = paginator.page(paginator.num_pages)
context = {'topics': topics, 'discussion': discussion, 'sort_value':sort_query,}
return render(request, 'forum/forum_show_posts.html', context)
и мой шаблон, чтобы иметь соответствующие ссылки для каждого метода упорядочения:
<div class="dropdown-menu">
<a class="dropdown-item disabled" href="#">Sort...</a>
<form method="GET" action="">
<div class="input-group">
<button class="dropdown-item" type="submit" name="sort" value="newest">Newest</button>
<button class="dropdown-item" type="submit" name="sort" value="oldest">Oldest</button>
<button class="dropdown-item" type="submit" name="sort" value="views">Views</button>
<button class="dropdown-item" type="submit" name="sort" value="comments">Comments</button>
<button class="dropdown-item" type="submit" name="sort" value="replies">Replies</button>
<button class="dropdown-item" type="submit" name="sort" value="name">Name</button>
</div>
</form>
</div>
Теперь, когда я на самом деле идти вперед и выбрать на заказ по самым новым или Старые, сортирует их, делая URL выглядеть следующим образом:
https://www.domain.com/forum/topic/?sort=newest
Моя проблема заключается в том, что, скажем, я хотел найти «тест» делает URL
https://www.domain.com/forum/topic/?q=test
, но когда я хотите сортировать с поиском уже, что перезаписывается, и вместо этого он просто показывает все сообщения, с тем, что я выбрал для его сортировки. Как мне его сортировать, даже если поиск уже существует, и если поиск еще не сортируется.
От https://www.domain.com/forum/topic/?q=test
до https://www.domain.com/forum/topic/?q=test&sort=newest
so Он показывает новейший список сообщений с запросом 'test'.
Как насчет сохранения параметра 'q' в скрытом входе формы сортировки? –
@ Джордан Джамбазов вы можете уточнить больше? – Zer0
Отчасти проблема заключается в том, что при отправке сортировки параметр 'q' исчезает. Причина в том, что в форме сортировки есть 'action =" "'. Если вы храните запрос в скрытом вводе формы сортировки, например. '', вы также будете сохранять запрос во время поиска. –