2016-08-20 16 views
0

私は現在、問題の解決策を見つけようとしています。だから私はとても似ているURLがあります。私のビューで複数のrequest.GETパラメータに基づくフィルタリングとオーダー

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

:私のテンプレートビューで

https://www.domain.com/forum/topic/

を、私は、フォームや記事を検索するための責任があるの入力を持っています検索行為の.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) 

私はそれが正常に動作し、検索を実行すると、それが実際にフィルタをこれURLを作る私のクエリに基づいてオブジェクトは、として表示されます(S)

https://www.domain.com/forum/topic/?q=test

今、私は私のオブジェクトの順で仕事をしたいので、私はあることを議論ビューを変更するために進めた:

私は実際には先に行くと、最新で注文することを選択した場合、または今

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

を:

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) 
と私のテンプレートは、発注の各メソッドに対応するリンクを持っています

https://www.domain.com/forum/topic/?sort=newest

私の問題であるというのが、私はURLを作成する「試験」を検索したいとしましょう

https://www.domain.com/forum/topic/?q=test

が、ときに私は:最古のは、それはのようにURLが表示され作り、それらをソート上書きされた検索で既にソートしたいのですが、代わりにすべての投稿を表示します。すでにそこにある検索でもソートするにはどうしたらいいですか?検索がない場合はソートしてください。

からhttps://www.domain.com/forum/topic/?q=testからhttps://www.domain.com/forum/topic/?q=test&sort=newestです。これは、クエリ 'test'を持つ投稿の最新リストを示しています。あなたがあるためにあなたのビューを更新し、あなたのGETのparamsを追跡する必要が

+0

ソートフォームの非表示入力に 'q'パラメータを格納するとどうなりますか? –

+0

@JordanJambazovあなたはもっと詳しく説明できますか? – Zer0

+0

問題の一部は、ソートをサブミットすると、 'q'パラメータが消えることです。理由は、ソートフォームに 'action =" "'があるからです。並べ替えフォームの非表示入力にクエリを格納すると、たとえば次のようになります。 'を実行すると、検索中もクエリが保持されます。 –

答えて

1

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

関連する問題