私は現在、問題の解決策を見つけようとしています。だから私はとても似ている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を追跡する必要が
ソートフォームの非表示入力に 'q'パラメータを格納するとどうなりますか? –
@JordanJambazovあなたはもっと詳しく説明できますか? – Zer0
問題の一部は、ソートをサブミットすると、 'q'パラメータが消えることです。理由は、ソートフォームに 'action =" "'があるからです。並べ替えフォームの非表示入力にクエリを格納すると、たとえば次のようになります。 'を実行すると、検索中もクエリが保持されます。 –