2016-08-20 3 views
0

В настоящее время я пытаюсь найти решение моей проблемы. Таким образом, у меня есть 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'.

+0

Как насчет сохранения параметра 'q' в скрытом входе формы сортировки? –

+0

@ Джордан Джамбазов вы можете уточнить больше? – Zer0

+0

Отчасти проблема заключается в том, что при отправке сортировки параметр 'q' исчезает. Причина в том, что в форме сортировки есть 'action =" "'. Если вы храните запрос в скрытом вводе формы сортировки, например. '', вы также будете сохранять запрос во время поиска. –

ответ

1

Вы должны следить за вашими GET Params, обновите ваш взгляд будет:

def discussion(request, discussion): # <<- view name and var name both are same which might cause issues 
    search_query = request.GET.get('q', '') 
    sort = request.GET.get('sort', '') 
    direction = request.GET.get('dir', 'asc') 
    if direction not in ['asc', 'desc']: 
     direction = 'asc' 

    topics_list = Topic.objects.all().filter(discussion__url=discussion) 
    discussion = Discussion.objects.get(url=discussion) 

    if search_query: 
     topics_list = topics_list.filter(
      Q(title__icontains=search_query) | 
      Q(user__username__icontains=search_query) 
     ) 

    if sort: 
     order_by = '{0}{1}'.format('-' if direction == 'desc' else '', sort) 
     topics_list = topics_list.order_by(order_by) 

    # rest of code 
    # pass search_query, sort and direction in context 
    context = { 
     'topics': topics, 
     'discussion': discussion, 
     'sort': sort, 
     'direction': direction, 
     'search_query': search_query, 
    } 

    return render(request, 'forum/forum_show_posts.html', context) 

Теперь в шаблоне отслеживания этих Params в обеих формах:

Форма поиска:

<form method="GET" action=""> 
    <div class="input-group"> 
     <input type="text" name="q" placeholder="Search..." value="{{ search_query }}" class="form-control"> 
     <span class="input-group-btn"> 
      <input class="btn btn-secondary" type="submit" value="Search"> 
     </span> 
    </div> 
    <input type="hidden" name="sort" value="{{ sort }}" /> 
    <input type="hidden" name="direction" value="{{ direction }}" /> 
</form> 

Форма сортировки:

<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> 

      <input type="hidden" name="search_query" value="{{ search_query }}" /> 
      <input type="hidden" name="direction" value="{{ direction }}" /> 

     </form> 
</div> 
+0

Кажется, что вы не заказываете сообщения, независимо от того, как они меняются с asc или desc, однако он ищет сообщения с указанным текстом, но он все еще показывает мои старые запросы. – Zer0

+0

Спасибо! Я использовал некоторый код, который вы мне специально предоставили для сохранения параметров GET и сумел решить проблему. – Zer0

Смежные вопросы