【发布时间】:2016-08-20 10:27:44
【问题描述】:
我目前正忙于寻找解决问题的方法。所以我有一个这样的网址:
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>
在我的 Views.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 显示为:
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 所以它显示了带有查询'test'的最新帖子列表。
【问题讨论】:
-
将
q参数存储在排序表单的隐藏输入中怎么样? -
@JordanJambazov 你能详细说明一下吗?
-
部分问题是提交排序时,
q参数消失。原因是排序表单有action=""。如果您将查询存储在排序表单的隐藏输入中,例如<input type="hidden" name="q" value="{{ request.GET.q }}">,您还将在搜索期间保留查询。 -
我这样做了,但它隐藏了搜索栏,它仍然没有保留 q